下面是导致异常的代码块,
代码:
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上的实现已发生更改
您不需要只返回-1或1。一般合同规定,如果第一个元素较小,则返回的数字必须为负,如果它们相等,则返回零,如果第二个元素较小则返回正。因此,您可以跳过if/else语句并返回:
return tas1.order - tas2.order;
比较方不遵守总合同。看看这个:
if ( tas1.order < tas2.order )
return -1;
else
return 1;
}
现在考虑两个具有相同顺序
的对象。比较它们应返回0。
如果您使用的是Java 7,最好委托给< code>Integer.compare:
return Integer.compare(tas1.order, tas2.order);
或者如果您使用的是早期版本:
return tas1.order == tas2.order ? 0
: tas1.order < tas2.order ? -1
: 1;
对不起,又是一个问题,但我根本不明白这里发生了什么,或者我哪里出错了。 概述:我有一个包含多个-对象。它们有一个和一个。我想按以下条件对它们进行排序,优先级如下所列: 但是当这样做时,我得到以下错误: 我得到的:我在JavaFX项目中也有同样的事情发生,但是在那里我使用而不是。我需要转换为,因为显然Android还不支持方法。 这是启动排序和定义< code>Comperator的方法: 如您所见
我认为下面的comprator实现是错误的。它会给我一个字符串的排序。但当我使用这个实现对List进行排序时,它不会抛出以下异常:“java.lang.IllegalArgumentException:Comparison方法违反了它的一般约定!” 问:为什么上面的异常不是由 Collections.sort(list, new WrongComparator()) 方法调用抛出的?
可能的重复: 为什么我的比较方法会抛出异常 — 比较方法违反了其一般合同! 我有这个代码: 有时它会引发以下异常: 为什么? 1) 我该如何避免呢?2) 我怎么能抓住这个例外? 提前谢谢。
我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。
我使用了下面的代码,它抛出了一个IllegalArgumentException: 抛出异常: 这由以下函数调用: 它在我们的本地机器上运行良好,但在生产上失败了,我们无法连接到机器来找出原因。你能帮忙吗
我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误: