报错代码:
Comparator<InspectReportListItemMpVo> comparator = new Comparator<InspectReportListItemMpVo>() {
@Override
public int compare(InspectReportListItemMpVo o1, InspectReportListItemMpVo o2) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date reportTime_o1 = simpleDateFormat.parse(o1.getReportTime());
Date reportTime_o2 = simpleDateFormat.parse(o2.getReportTime());
return reportTime_o2.compareTo(reportTime_o1);
} catch (ParseException e) {
e.printStackTrace();
return 1;
}
}
};
result.getItems().sort(comparator);
报错截图:
Comparison method violates its general contract
问题解决:
(不严谨!)将catch块里的return 1;改为return 0;
补充:严谨写法
Collections.sort(list, new Comparator<String>() {
public int compare(String arg1, String arg2) {
/**
* 优化后写法
*/
if(StringUtils.isBlank(arg1) ) {
if(StringUtils.isBlank(arg2)) {
return 0;
}else {
return -1;
}
}else if(StringUtils.isBlank(arg2)){
return 1;
}
return arg1.compareTo(arg2);
}
});
原因:TimSort有自反性检查
Timsort算法规则: JDK7以后,实现Comparable接口后,要满足一下三个特性: 1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。 2) 传递性:x>y,y>z,则 x>z。 3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。
如上错误代码,如果直接return 1 ,假设A为空,A.compareTo(B)=1,B.compareTo(A)=1,不满足自反性
|