在重寫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
浙公網安備 33010602011771號