java中的比较器接口

时间:2013-12-04 09:55:30

标签: java

Comparator是一个界面,我相信它无法实例化,但请看下面的代码片段

Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
                { 
                             //Compare method
                        });

这里比较器接口已经实例化,这是正确的代码方式。 有人请帮忙。 感谢

5 个答案:

答案 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*/}  );

通过匿名类(您的情况)完成。