在重寫Comparator類的compare的方法時,報如下的錯誤,還沒有查到具體原因,因為相同的程序數據量不同,所以不知道是不是數據量太大導致報這個錯???

public class ComparatorFloor implements Comparator<DormFloor> {

    public int compare(DormFloor o1, DormFloor o2) {
        if(o1.getSort()!=null && o2.getSort()!=null){
            return o1.getSort().compareTo(o2.getSort());
        }else{
            return o1.getFloorName().compareTo(o2.getFloorName());
        }
    }
    
}

 


java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:899) at java.util.TimSort.mergeAt(TimSort.java:516) at java.util.TimSort.mergeCollapse(TimSort.java:441) at java.util.TimSort.sort(TimSort.java:245) at java.util.Arrays.sort(Arrays.java:1512) at java.util.ArrayList.sort(ArrayList.java:1454) at java.util.Collections.sort(Collections.java:175) at com.chinabnd.dorm.action.ActionFloor.detailread(ActionFloor.java:476) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:871) at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1294) at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)

 

 上面的異常問題過了好幾天,一直沒有解決,于是閑暇時間又拿出來,百度一下,找到一個能看得懂的解決辦法,并且修改比較方法后,確實沒再報異常。

 

我本以為是取前十后十的時候有問題,后來百度了一下,這個問題應該是出現在jdk7以后的java版本,而且報錯是概率性的(這個博主也不是很明白)。

在在 JDK7 版本以上,Comparator 要滿足自反性,傳遞性,對稱性
說明:
1) 自反性:x,y 的比較結果和 y,x 的比較結果相反。(如果兩個值是相等的,那么compare方法需要返回0)
2) 傳遞性:x>y,y>z,則 x>z。
3) 對稱性:x=y,則 x,z 比較結果和 y,z 比較結果相同
上面的就是沒有考慮到都為null的情況這樣會不滿足上面的3個準則

修改后的代碼:

package com.chinabnd.dorm.model.entity;

import java.util.Comparator;

public class ComparatorFloor implements Comparator<DormFloor> {

    public int compare(DormFloor o1, DormFloor o2) {
        /*if(o1.getSort()!=null && o2.getSort()!=null){
            return o1.getSort().compareTo(o2.getSort());
        }else{
            return o1.getFloorName().compareTo(o2.getFloorName());
        }*/
        if(o1.getSort()==null && o2.getSort()==null){
            return 0;
        }
        if(o1.getSort()==null){
            return 1;
        }
        if(o2.getSort()==null){
            return -1;
        }
        return o1.getSort().compareTo(o2.getSort());
    }
    
}

上面紅色的兩行代碼是對不同的屬性進行判斷,但是這樣可能會違反傳遞性和對稱性的,就是a=b,b=c,但是a>b,所以要用同一個屬性來進行判斷。這樣改存在一個問題就是,相同屬性值排序會排在一起。

 

修改后排序:

 

 


————————————————
版權聲明:本文為部分內容為CSDN博主「Twised」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36802747/article/details/95453725