天天看點

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分為 兩個清單,隻對有值的清單進行排序。