在获取超过1000条记录时,它显示错误,如果少于1000条记录,则其显示没有任何问题 错误如下所示
System Error: Comparison method violates its general contract!
java.lang.IllegalArgumentException: Comparison method violates its general contract!
应用程序在spring-hibernate框架中
错误显示的行
Collections.sort(adHoc, new SortList());
Collections.sort(hourly, new SortList());
Collections.sort(daily, new SortList());
Collections.sort(weekly, new SortList());
Collections.sort(monthly, new SortList());
Collections.sort(quarterly, new SortList());
Collections.sort(yearly, new SortList());*
更新:添加了SortList
class SortList implements Comparator<MeasurementReading> {
public int compare(MeasurementReading o1, MeasurementReading o2) {
String cat1 = o1.getType().getQuantity().getCategory().getName();
String quantityName1 = o1.getType().getQuantity().getName();
String name1 = cat1 + "- " + quantityName1;
String cat2 = o2.getType().getQuantity().getCategory().getName();
String quantityName2 = o2.getType().getQuantity().getName();
String name2 = cat2 + "-" + quantityName2;
return name1.compareTo(name2);
}
}
答案 0 :(得分:0)
真正的问题出在Comparator
实施中。由于某种原因,它不服从Comparator
应遵守的不变量之一。
这只会出现大于1000的集合这一事实很巧合。集合越大,排序遇到一组触发错误行为的元素的可能性就越大。
合同(来自javadocs)如下:
实施者必须确保所有
sgn(compare(x, y)) == -sgn(compare(y, x))
和x
都y
。 (这意味着compare(x, y)
当且仅当compare(y, x)
抛出异常时才必须抛出异常。)实现者还必须确保关系具有传递性:
((compare(x, y)>0) && (compare(y, z)>0))
隐含compare(x, z)>0
。最后,实施者必须确保
compare(x, y)==0
暗示所有sgn(compare(x, z))==sgn(compare(y, z))
都z
。
如果没有看到Comparator
的代码,我们就无法更具体。
<强>更新强>
从表面上看,你的比较器看起来还不错。但是,您依靠各种方法为您提供组装成字符串以进行比较的信息。如果在您排序时其中一个方法调用的结果发生了变化,那么您可能会违反合同。我怀疑你在排序时测量结果正在发生变化。