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