可能重复:
“Comparison method violates its general contract!”“比较方法违反其总合同!” - 寻找小样本数据集
我有我要排序的Java 7,并得到部分排序的数据(> 700个项目)的大样本以下例外:
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.mergeCollapse(TimSort.java:410)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
现在我试图降低数据集的大小,使查找原因更简单。我写了一个小应用程序,它从大集合中挑选一个随机子集来重现异常。
private static final int SUBSET_SIZE = 32;
public void testSorting() {
...
final Random random = new Random();
for (int i = 10000000; i-- > 0;) {
testFew(strings, random);
}
}
private void testFew(List<String> strings, Random random) {
final List<String> list = new ArrayList<String>();
int index = 0;
for (int i = 0; i < SUBSET_SIZE; i++) {
final int rnd = random.nextInt(strings.size()/100) + 1;
index = (index + rnd) % strings.size();
list.add(strings.get(index));
}
try {
Collections.sort(list, MY_COMPARATOR);
}
catch (RuntimeException ex) {
for (String s : list) {
System.err.println(s);
}
throw ex;
}
}
奇怪的是,找到一个样本复制是很简单的,如果子集包含至少32个项目,但我从来没有成功地找到了一套小。恕我直言,这听起来就像排序算法中的错误比我们的比较器。
你可以在这里发布你的比较? – Baz
我打赌1000美元的错误是在你的代码中,而不是在排序算法中。为什么不把它的代码发布给我们来检查它,以及异常的完整堆栈跟踪? –