この例外に関する他の質問を見てきましたが、私の比較方法は非常に単純であるため、何が問題なのかを理解できず、所有しているどの Android デバイスでも再現できません。
Android アプリの一部のユーザーからこの例外が発生しています。そのほとんどは、マージ ソートの Java 7 バリアントを実行していると思われる GS3 や GS4 などの非常に新しいデバイスにあるようです。
これが私の比較方法です:
Collections.sort(collectionOfThings, new Comparator<Thing>()
{
public int compare(Thing lhs, Thing rhs)
{
//getDist() returns a Double with a capital D...perhaps that has something to do with it?
if(lhs.getDist() < rhs.getDist())
{
return -1;
}
if(lhs.getDist() == rhs.getDist())
{
return 0;
}
return 1;
};
});
例外は次のとおりです。
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:743)
at java.util.TimSort.mergeAt(TimSort.java:479)
at java.util.TimSort.mergeCollapse(TimSort.java:404)
at java.util.TimSort.sort(TimSort.java:210)
at java.util.TimSort.sort(TimSort.java:169)
at java.util.Arrays.sort(Arrays.java:2038)
at java.util.Collections.sort(Collections.java:1891)
Android 4.0以降に限定されているようです。どんな助けでも大歓迎です。