Comparator是一个界面,我相信它无法实例化,但请看下面的代码片段
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
//Compare method
});
这里比较器接口已经实例化,这是正确的代码方式。 有人请帮忙。 感谢
答案 0 :(得分:3)
实现接口和此实现的正确方法之一称为anonymous class。
请注意,您实现的Comparator
实例无法作为变量引用。
另一个注意事项:您必须提供
的实现public int compareTo(Map.Entry<String, Integer> entry1,
Map.Entry<String, Integer> entry2) { .. }
方法,否则无法编译。
答案 1 :(得分:1)
这是一种可接受的代码方式。编译器会将Comparator
接口的实现转换为类。因为您没有为类提供名称,所以这称为匿名类。
我对使用匿名类没有任何问题,但我更喜欢使用变量,用于匿名类的实例。这使您有机会提供一个名称,说明您的比较器将进行何种比较。在这种情况下,我可能会写这样的东西。
Comparator<Map.Entry<String, Integer>> byValueDescendingThenKey =
new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) {
int valueComparison = entry1.getValue().compareTo(entry2.getValue());
if (valueComparison != 0) {
return -valueComparison;
} else {
return entry1.getKey().compareTo(entry2.getKey());
}
}
};
Collections.sort(list,byValueDescendingThenKey);
请注意,如果引用Comparator
的变量有一个很好的描述性名称,那么排序的行会更清晰。
答案 2 :(得分:0)
Comparator
的匿名实例必须通过实现compare
方法来满足接口。 Comparator
是SAM(单一抽象方法)接口,允许通过匿名类实例化。
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
public int compare(Map.Entry<String,Integer> entry1, Map.Entry<String,Integer> entry2) {
}
});
答案 3 :(得分:0)
Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) {
// logic here
return 0;
}
};
这是您实现Comparator
界面的方式。显然你不会返回0
。此构造称为匿名内部类。如果你只想在一个地方使用这个实现,这是有道理的。
答案 4 :(得分:0)
1)您可以在一个单独的类中实现Comparator,并将其作为Collection.sort()方法中的第二个参数引用
2)或者对于第二个参数,您可以将实现“置于”,即
Collections.sort( (Collection) argument, new Comparator<Map.Entry<String, Integer>>(){ /*your implementation*/} );
通过匿名类(您的情况)完成。