2

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

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);
                }
            }
        });

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

谢谢!

4

5 回答 5

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);
}
于 2012-01-06T11:38:49.183 回答
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());
}
于 2012-01-06T11:47:26.243 回答
1

如果getId()返回一个 int,你可以简单地使用 return id1.compareTo(id2),这会给你正确的结果。希望这可以帮助。

于 2012-01-06T11:25:51.727 回答
1

是的,我做同样的事情。一种说法是,您可以使用诸如 Apache Commons Collections 的 NullComparator 之类的 nullsafe 比较工具来放弃代码中的所有这些 null 检查:

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

于 2012-01-06T11:29:36.053 回答
1

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

java.util.List 规范说你可以在一个列表中有空值,在某些情况下你可以有多个空值。一旦尝试对o?.getId()null 元素执行操作,您的 Comparator 就会失败并返回 NullPointerException。

我通常做的是创建我的类implement java.lang.Comparable,然后我可以在添加元素时使用 Map 对元素进行排序。一个人通常必须构建列表,那么为什么不构建一个 TreeMap 呢?

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

于 2012-01-06T11:54:33.947 回答