今天遇到了一个Comparison method violates its general contract!问题,本来是同一个方法一个取了前十后十,一个是显示全部,然后一个报错,一个却能正常问题,排序代码如下
public Comparator<ZcglZlcgsyl> down = new Comparator<ZcglZlcgsyl>() {
@Override
public int compare(ZcglZlcgsyl o1, ZcglZlcgsyl o2) {
if (o1.getZlcgsyl() == null) {
return 1;
}
if (o2.getZlcgsyl() == null) {
return -1;
}
return o2.getZlcgsyl().compareTo(o1.getZlcgsyl());
}
};
我本以为是取前十后十的时候有问题,后来百度了一下,这个问题应该是出现在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个准则
于是修改后成这样就不会报错了
public Comparator<ZcglZlcgsyl> down = new Comparator<ZcglZlcgsyl>() {
@Override
public int compare(ZcglZlcgsyl o1, ZcglZlcgsyl o2) {
if (o1.getZlcgsyl() == null && o2.getZlcgsyl() == null) {
return 0;
}
if (o1.getZlcgsyl() == null) {
return 1;
}
if (o2.getZlcgsyl() == null) {
return -1;
}
return o2.getZlcgsyl().compareTo(o1.getZlcgsyl());
}
};
看了别的博客之后发现都写的特别详细,感觉看完还是比较云里雾里的,于是就自己写了个