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

Java 当获取超过1000条记录时,其显示错误,如果少于1000条记录,则其显示没有任何问题,java,spring,hibernate,Java,Spring,Hibernate,当获取超过1000条记录时,其显示错误,如果少于1000条记录,则其显示没有任何问题 错误如下所示 System Error: Comparison method violates its general contract! java.lang.IllegalArgumentException: Comparison method violates its general contract! 该应用程序位于SpringHibernate框架中 显示错误的行 Collection

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

System Error: Comparison method violates its general contract! 
java.lang.IllegalArgumentException: Comparison method violates its general contract!       
该应用程序位于SpringHibernate框架中

显示错误的行

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);
    }
}
类SortList实现了Comparator{
公共整数比较(测量o1,测量o2){
字符串cat1=o1.getType().getQuantity().getCategory().getName();
字符串quantityName1=o1.getType().getQuantity().getName();
字符串名称1=cat1+“-”+quantityName1;
字符串cat2=o2.getType().getQuantity().getCategory().getName();
字符串quantityName2=o2.getType().getQuantity().getName();
字符串名称2=cat2+“-”+quantityName2;
返回name1.compareTo(name2);
}
}

真正的问题在于
比较器的实现。出于某种原因,它不遵循比较器应该遵循的不变量之一

这只出现在大于1000的集合中,这是巧合。集合越大,排序就越有可能遇到触发错误行为的一组元素

合同(来自)如下所示:

实施者必须确保所有
x
y
sgn(比较(x,y))==-sgn(比较(y,x))
。(这意味着
compare(x,y)
必须在且仅当
compare(y,x)
引发异常时才会引发异常。)

实现者还必须确保关系是可传递的:
((比较(x,y)>0)和&(比较(y,z)>0))
意味着
比较(x,z)>0

最后,实现者必须确保
compare(x,y)==0
意味着
sgn(compare(x,z))==sgn(compare(y,z))
对于所有
z


如果不查看您的
比较器的代码,我们将无法更具体地说明


更新


从表面上看,你的比较仪看起来不错。但是,您依赖于各种方法来提供组装成字符串以进行比较的信息。如果其中一个方法调用的结果在排序时发生更改,则您有责任违反合同。我怀疑在排序时您的测量值正在更改。

您需要将
SortList
的代码显示为@geo,并说,请粘贴SortList的代码。另外,你搜索过这个吗?我认为这是一个相当普遍的问题!