在java中实现Comparator比较方法的最佳方法?

时间:2012-01-06 11:24:07

标签: java compare compareto

我写了一个比较器,按升序排序,如下所示。哪个运作良好。

Collections.sort(resultList,new Comparator<MyModelClass>() {
            @Override
            public int compare(MyModelClass o1, MyModelClass o2) {
                Integer id1= o1.getId();
                Integer id2= o2.getId();
                if(id1 == null && id2 == null) {
                    return 0;               
                }else if(id1 != null && id2 == null) {
                    return -1;
                } else if (id1 == null && id2 != null) {
                    return 1;
                } else {                
                    return id1.compareTo(id2);
                }
            }
        });

这样实施好吗?请帮帮我?

谢谢!

5 个答案:

答案 0 :(得分:5)

它的可读性看起来不错,但效率稍高一些可能是:

public int compare(MyModelClass o1, MyModelClass o2) {
    Integer id1= o1.getId();
    Integer id2= o2.getId();
    if (id1 == null) {
        return id2 == null ? 0 : 1;
    }
    if (id2 == null) {
        return -1;
    }
    return id1.compareTo(id2);
}

甚至:

public int compare(MyModelClass o1, MyModelClass o2) {
    Integer id1= o1.getId();
    Integer id2= o2.getId();
    if (id1 == null) {
        return id2 == null ? 0 : 1;
    }

    return id2 == null ? -1 : id1.compareTo(id2);
}

答案 1 :(得分:3)

如果你需要几个比较器中的空安全比较逻辑,那么我建议在这样的实用程序类中使用静态助手:

public static int compare(Comparable c1, Comparable c2) {
    return c1 == null
               ? (c2 == null ? 0 : 1)
               : (c2 == null ? -1 : c1.compareTo(c2));
}

然后可以将比较器简化为:

public int compare(MyModelClass o1, MyModelClass o2) {
    return CompareHelper.compare(o1.getId(), o2.getId());
}

答案 2 :(得分:1)

如果getId()返回一个int,您只需返回id1.compareTo(id2),这将为您提供正确的结果。希望这会有所帮助。

答案 3 :(得分:1)

是的,我有点做同样的事情。有一点需要注意的是,您可以使用诸如Apache Commons Collections的NullComparator之类的nullsafe比较工具来放弃代码中的所有空检查:

http://commons.apache.org/collections/api-2.1.1/org/apache/commons/collections/comparators/NullComparator.html#compare(java.lang.Object,java.lang.Object)

答案 4 :(得分:1)

不,这不是一个好的实施。

java.util.List规范说明你可以在列表中有空值,在某些情况下你可以有多个空值。 只要尝试对null元素执行o?.getId(),Comparator就会因NullPointerException而失败。

我通常做的是创建我的班级implement java.lang.Comparable,然后我可以使用Map在添加元素时对元素进行排序。通常需要构建列表,以便为什么不构建TreeMap?

如果您正在重复使用您的课程并希望以不同的方式对其进行排序,则可以在构造函数中创建一个TreeMap Comparator,这样就无需对其进行显式排序。