Collections.sort 抛出异常:Comparison method violates its general contract!
原因:list数据中存在相等或者为null得数据,未进行特殊处理。
在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,
Collections.sort 会报 IllegalArgumentException 异常。
说明:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。
解决办法:对数据为null或者数据相等得情况需要进行处理:
Collections.sort(list, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> map1, Map<String, Object> map2) {
Object dataStr1 = map1.get("date");
Object dataStr2 = map2.get("date");
if(!AppUtils.isNotEmpty(dataStr1)&&!AppUtils.isNotEmpty(dataStr2)){
return 0;
}
if(!AppUtils.isNotEmpty(dataStr1)){
return 1;
}
if(!AppUtils.isNotEmpty(dataStr2)){
return -1;
}
Date date1 = (Date)(dataStr1);
Date date2 = (Date)(dataStr2);
return date2.compareTo(date1)
}
});