天天看点

Comparison method violates its general contract. 问题分析

参考这篇:https://www.cnblogs.com/wendelhuang/p/7356797.html

我的问题和这一篇的问题一样,引进了对 null值的处理,Java 1.6之前没有问题的,Java1.7、1.8之后更换了底层的排序算法,对我们自己实现的 Comparator接口的 compare方法有一定的要求:自反、传递、对称。

以下对null的处理不满足上述要求的:

if (bedNo1 == null || bedNo2 == null){
    return 1;
}
           

上述链接给出了一种方案,不同情况分别返回 1、-1、0,而不是始终返回 1,如下:

if (this.xxx == null && o.xxx == null) {
    return 0;
}
if (this.xxx == null) {
    return 1;
}
if (o.xxx == null) {
    return -1;
}
           

我自己也有另外一种方案,但是性能可能会差一点,因为引入了列表复制的操作,但也打算分享出来,参考下思路什么的。

Mine方案:比如需要根据 bedNo进行排序,我先将列表中 依据bedNo是否为null分为 两个列表,只对有值的列表进行排序。