1. ホーム
  2. ジャワ

Java ソート例外 比較メソッドの一般契約違反

2022-02-25 11:21:46

o1オブジェクトの開始時刻がo2の開始時刻より小さい場合、o1,o2の順序は交換されない、それ以外の場合は順序が交換されることを意味する、ソートコードを書いてください。

        if (o1.getTimeStart().getTime() < o2.getTimeStart().getTime()) {
          return -1;
        } else {
          return 1;
        }        

しかし、これまで遭遇したことのない例外メッセージが表示されて実行される

java.lang.IllegalArgumentException: Comparison method violates its general contract!
	at java.util.TimSort.mergeLo(TimSort.java:777)
	at java.util.TimSort.mergeAt(TimSort.java:514)
	at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
	at java.util.TimSort.sort(TimSort.java:254)
	at java.util.Arrays.sort(Arrays.java:1438)

JDK7以降に新しいソートアルゴリズムTimSortが置き換えられ、2つの値が等しい場合に判断せず、1として扱うため、例外が発生すると読んだことがあります。

詳細は後述

取得元:https://www.cnblogs.com/guolaoshi/p/11490878.html