我已經看到關於此異常的其他問題,但我的比較方法非常簡單,以至於我無法弄清楚它有什麼問題,並且我無法用任何我擁有的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'? –