当前位置: 首页 > 知识库问答 >
问题:

比较法抛出一般合同异常

万俟招
2023-03-14

下面是导致异常的代码块,

代码:

            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上的实现已发生更改

共有2个答案

臧弘和
2023-03-14

您不需要只返回-1或1。一般合同规定,如果第一个元素较小,则返回的数字必须为负,如果它们相等,则返回零,如果第二个元素较小则返回正。因此,您可以跳过if/else语句并返回:

return tas1.order - tas2.order;
章晋鹏
2023-03-14

比较方不遵守总合同。看看这个:

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方法中的错误。谢了。

  • 下面的代码是Dave Koelle的AlphanumComparator的编辑版本。编辑包含将空字符串排序到列表末尾或 底部的代码。问题是 为了解决我的问题,我调查了它并找到了诸如比较器没有 等原因; 在正确的位置。我还在Java错误数据库中发现了一条评论,上面写着 java.util.Arrays.sort和java.util.Collections.sort(间接地)使用的排序算法被替换了,新

  • 我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误: