java sort Comparator 排序異常:Comparison method violates its general contract!
阿新 • • 發佈:2021-02-08
java sort Comparator 排序異常:Comparison method violates its general contract!
異常日誌與程式碼
異常日誌
下面是comparetor實現
public static Comparator<KnowledgeRatioDTO> ratioComparator() {
return (o1, o2) -> {
if (o1.getRatio() >= o2.getRatio()) {
return -1;
}
return 1;
};
}
//其他地方呼叫展示(list sort 方法裡面還是array的sort)
knowledgeMasterVOList.sort(Orderings.ratioComparator());
解決方案
查了些資料並看程式碼發現 這個comparetor實現不規範引起的
改變了寫法後,排序正常,程式碼如下
public static Comparator<KnowledgeRatioDTO> ratioComparator() {
return (o1, o2) -> {
if (o1.getRatio() > o2.getRatio()) {
return -1;
}
if (o1.getRatio().equals(o2.getRatio())) {
return 0;
}
return 1;
};
}
或者用基本資料型別的封裝類 提供的比較器實現,程式碼如下(推薦)
public static Comparator<KnowledgeRatioDTO> bbb() {
return (o1, o2) -> Integer.compare(o2.getRatio(), o1.getRatio());
}
疑問討論:
今天測試環境發現的,但線上沒有問題。 也不知道為什麼
- 測試環境資料的樣本 與 線上環境幾乎一致(排除資料方向的問題)
- 排除 jdk 版本的問題 (各環境用的都是一個jdk映象)
各位老鐵 看你們的了
參考文章:(感興趣可以看看)
https://stackoverflow.com/questions/11441666/java-error-comparison-method-violates-its-general-contract
(還有一些無用沒什麼價值的文章就在此展示)