【发布时间】:2013-04-18 08:58:15
【问题描述】:
下面是导致异常的代码块,
代码:
Collections.sort( arrayList, new Comparator()
{
public int compare( Object o1, Object o2 )
{
TypeAdapterSort tas1 = ( TypeAdapterSort ) o1;
TypeAdapterSort tas2 = ( TypeAdapterSort ) o2;
if ( tas1.order < tas2.order )
return -1;
else
return 1;
}
} );
例外:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
at java.util.TimSort.sort(TimSort.java:223)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
当我运行与独立程序相同的代码时,问题永远不会发生。这里的比较器有什么问题?有没有办法在独立代码中重现该问题?
此问题仅在 Java 1.7 上出现,因为 Arrays.sort 和 Collections.sort 的实现发生了变化。如何更改上述代码以避免该问题?另外,如何在独立代码中重现此问题?
【问题讨论】:
-
如果订单类型为
Integer,您可以返回tas1.order.compareTo(tas2.order) -
“独立程序”是什么意思?或者更确切地说,运行您所指的代码的其他选项是什么?
标签: java collections comparator