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

Java7:java.lang.IllegalArgumentExc的:比较方法违反其一般合同

梅飞龙
2023-03-14

我正在将我们的项目升级到java 7。我遇到了Collections.sort()的非法参数异常。我知道这个异常的原因是java 7中新的Timsort(我确实抛出了之前在这个问题上提出的所有问题)。现在我需要修改比较逻辑来克服这个异常。这是我的比较方法

if (o1.isLookup() && !o2.isLookup()) {
    return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
    return 1;
}

if (o1.dependsOn(o2)) {
    return 1;
}
if (o2.dependsOn(o1)) {
    return -1;
}
return 0;

> < li>

我尝试覆盖equals()方法,使用与compare相同的逻辑,认为如果equals和compare返回相同的结果,应该可以解决问题;但是并没有达到预期的效果。

当我将compare方法分成两个单独的比较器时,如下所示,排序(使用两个比较器)不会抛出任何异常。可能的原因是什么?

代码如下:

protected Comparator<EntityWrapper> getComparator2() {      
    return new Comparator<EntityWrapper>() {
        public int compare(EntityWrapper o1, EntityWrapper o2) {
            if (o1.dependsOn(o2.entityClass)) {
                // This depends on otherWrapper
                return 1;
            }
            if (o2.dependsOn(o1.entityClass)) {
                // OtherWrapper depends on this
                return -1;
            }
            return 0;
        }
    };
}

protected Comparator<EntityWrapper> getComparator1() {
    return new Comparator<EntityWrapper>() {
public int compare(EntityWrapper o1, EntityWrapper o2) {
        if (o1.isLookup() && !o2.isLookup()) {
            return -1;
        }
        if (!o1.isLookup() && o2.isLookup()) {
            return 1;
        }
        return 0;
    };
}

共有1个答案

易风华
2023-03-14

您是否缺少“.entityClass”,例如:

if (o1.isLookup() && !o2.isLookup()) {
    return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
    return 1;
}

if (o1.dependsOn(o2.entityClass)) {
    return 1;
}
if (o2.dependsOn(o1.entityClass)) {
    return -1;
}
return 0;
 类似资料:
  • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。

  • 我在尝试对节点的数组列表进行排序时遇到了这个错误。我尝试了大多数解决方案,但没有一个在我的案例中有效。 此代码为 它适用于小输入,但是当输入数量很大时,它会给出这个错误。我也读过比较方法中的传递性规则,但我不知道它是如何在这种情况下应用的。 先谢谢你。

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

  • 我看到我的应用程序在一些中国 Android 手机上发生了很多崩溃,并出现错误:比较方法违反了其总合同! 我读过这与Collections.sort有关。 我不太确定的是,这是否是因为我的自定义比较器。 以下是错误发生的地方: 比较器是这样的: 所以我不太确定比较器是否搞砸了什么,或者我是否需要以不同的方式进行collections.sort调用 感谢任何帮助

  • 下面是导致异常的代码块,如所示, 代码: 例外情况: 当我将相同的代码作为独立程序运行时,该问题从未出现。这里的比较器有什么问题?有没有办法在独立代码中重现该问题? 这个问题只在Java 1.7上出现,因为Arrays.sort上的实现发生了变化

  • 我不确定出了什么问题。我查阅了其他类似的关于堆栈溢出的问题和答案,但不确定我的方法有什么问题。我是java初学者,所以任何帮助都将是巨大的。谢谢你。 我的代码是: 错误: