用于对集合进行排序的比较器实现

时间:2015-12-27 20:40:40

标签: java comparator

最近我试图更熟悉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;中还有一个带有覆盖方法的代码。括号。这是创建对象的常规方式吗?我以前从未见过它,我想了解更多相关信息。你能告诉我一些反馈材料,我可以找到更多关于它的信息吗?

2 个答案:

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

作为个人建议,请始终检查您的参数是否为空值,因为您实际上并不知道会传递什么...