1. ホーム

比較方式は一般的な契約に違反する!

2022-02-25 19:01:26

プロジェクト実行中に例外が発生しました。 Comparison メソッドが一般的な契約に違反している! という例外があり、その理由はネットで調べても比較的はっきりしています。

Collections.sort(list, new Comparator<Integer>() {  
    @Override  
    public int compare(Integer o1, Integer o2) {  
        return o1 > o2 ? 1 : -1;// the wrong way  
    }  
});  

コードの書き方をチェックすること自体が問題で、4行目は o1 == o2 の場合を考慮していません。

JDK6では正常に動作しますが、JDK7では上記の例外が発生する可能性があります。

その理由は これは、基盤となるJDK7のソートアルゴリズムが変更され、新しいアルゴリズムが以下の制約を満たす必要があるためです。

sgn(compare(x, y)) == -sgn(compare(y, x))

簡単に言うと、「等号が指定されている場合は0を返さなければならない」ということです。

神様のおかげで、CSDNブログの閲覧元は以下の通りです。

比較方式が一般契約に違反!

取得元:https://www.cnblogs.com/LionheartCGJ/p/7754437.html