1. 程式人生 > 其它 >java sort Comparator 排序異常:Comparison method violates its general contract!

java sort Comparator 排序異常:Comparison method violates its general contract!

技術標籤:java演算法

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());
    }

疑問討論:

今天測試環境發現的,但線上沒有問題。 也不知道為什麼

  1. 測試環境資料的樣本 與 線上環境幾乎一致(排除資料方向的問題)
  2. 排除 jdk 版本的問題 (各環境用的都是一個jdk映象)
    各位老鐵 看你們的了

參考文章:(感興趣可以看看)

https://stackoverflow.com/questions/11441666/java-error-comparison-method-violates-its-general-contract

(還有一些無用沒什麼價值的文章就在此展示)