最近我试图更熟悉Java中的Comparator接口。我有一个练习,即将StringList的字符串从最短到最长排序。我使用了弦乐比较器。在网上搜索时,我找到了以下解决方案:
public static Comparator<String> lengthComparator = new Comparator<String>() {
@Override
public int compare(String a, String b) {
if (a.length() == b.length()) {
return a.compareTo(b);
} else {
return (a.length() > b.length() ? 1 : -1);
}
}
};
然后我在我的代码中使用它来对集合进行排序:
Collections.sort(set, lengthComparator);
它有效。我想问的是这里定义lengthComparator对象的具体方法。我们创建了一个新对象:
new Comparator<String>()
使用默认构造函数。但是在&#34; {}&#34;中还有一个带有覆盖方法的代码。括号。这是创建对象的常规方式吗?我以前从未见过它,我想了解更多相关信息。你能告诉我一些反馈材料,我可以找到更多关于它的信息吗?
答案 0 :(得分:4)
是的,这是创建对象的常用方法,它被称为anonymous class
。
Comparator
是一个接口,您希望实例化一个类,因此您可以从实现anonymous class
的{{1}}创建一个对象。
Comparator
public void sortSetByStringLength(Set set) {
Comparator<String> lengthComparator = new Comparator<String>() {
@Override
public int compare(String a, String b) {
if (a.length() == b.length()) {
return a.compareTo(b);
} else {
return (a.length() > b.length() ? 1 : -1);
}
}
}
Collections.sort(set, lengthComparator);
}
在你的程序中以这种方式对列表进行排序:
public class LengthComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
if (a.length() == b.length()) {
return a.compareTo(b);
} else {
return (a.length() > b.length() ? 1 : -1);
}
}
}
答案 1 :(得分:1)
我不确定究竟是什么问题但是已经说过: 您实例化的是匿名类。实际上,正如您已经知道的那样界面无法实现。
所以,当你这样做时:
new Comparator<String>()
{
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return 0;
}
});
就像你创建了一个名为let的人说: LengthComparator 这样:
public class LengthComparator implements Comparator<String>{
public LengthComparator()
{
}
@Override
public int compare(String o1, String o2) {
int ack = 0;
if(o1 == null && o2 == null){
ack = 0;
}
else if(o1 != null && o2 == null){
// Decide what you should do here !
// returnValue = ???
}
else if(o1 == null && o2 != null){
// Decide here, too !
// returnValue = ???
}
else{
if(o1.length() == o2.length()){
// Sort by order ...
ack = o1.compareTo(o2);
}
else{
ack = o1.length() > o2.length() ? 1 : -1;
}
}
return ack;
}
}
作为个人建议,请始终检查您的参数是否为空值,因为您实际上并不知道会传递什么...