在重写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