Я видел другие вопросы об этом исключении, но мой метод сравнения настолько прост, что я не могу понять, что с ним не так, и я не могу воспроизвести его ни с одним из Устройства Android, которыми я владею.Android - метод сравнения нарушает его общий контракт
Я получаю это исключение от некоторых пользователей моего приложения для Android, большинство из которых, похоже, находятся на очень новых устройствах, таких как GS3 или GS4, которые, как я предполагаю, запускают вариант слияния Java 7 слияния.
Вот мой метод сравнения:
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+. Любая помощь приветствуется.
Я не уверен, что это исправит его, но я просто сделаю 'return lhs.getDist(). CompareTo (rhs.getDist());' http://docs.oracle.com/javase/6/ docs/api/java/lang/Double.html # compareTo (java.lang.Double) –
http://stackoverflow.com/questions/8327514/comparison-method-violates-its-general-contract –
Есть ли вероятность, что 'Thing.getDist()' изменяет 'Thing'? –