在获取超过1000条记录时,它显示错误,如果它少于1000条记录,则其显示没有任何问题

时间:2014-06-10 10:41:36

标签: java spring hibernate

在获取超过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);
    }
}

1 个答案:

答案 0 :(得分:0)

真正的问题出在Comparator实施中。由于某种原因,它不服从Comparator应遵守的不变量之一。

这只会出现大于1000的集合这一事实很巧合。集合越大,排序遇到一组触发错误行为的元素的可能性就越大。

合同(来自javadocs)如下:

  

实施者必须确保所有sgn(compare(x, y)) == -sgn(compare(y, x))xy。 (这意味着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的代码,我们就无法更具体。


<强>更新

从表面上看,你的比较器看起来还不错。但是,您依靠各种方法为您提供组装成字符串以进行比较的信息。如果在您排序时其中一个方法调用的结果发生了变化,那么您可能会违反合同。我怀疑你在排序时测量结果正在发生变化。