Java 7 : java. lang.IllegalArgumentException: 比较方法违反了它的一般契约

标签 java java-7

我正在将我们的项目升级到 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;
  1. 我尝试重写 equals() 方法,使用与 compare 相同的逻辑,认为如果 equals 和 compare 返回相同的结果应该可以解决问题;但它没有按预期工作。

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

代码如下:

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;
    };
}

最佳答案

你是不是缺少“.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 7 : java. lang.IllegalArgumentException: 比较方法违反了它的一般契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21030178/

相关文章:

java - JProfiler 可以在没有 GUI 的情况下运行吗?

java - Java 中是否已经存在 i18n 时间单位列表?

java - Android:如何判断我是否有权限打开目录?

java - 是否有用于解决年金问题的 Java API 或内置函数?

java - 如何让我的800*600游戏适合所有屏幕分辨率?

java - onDrawerClosed 和 onDrawerOpened 未被调用

java - 数组作为适当的对象

具有递归类型参数的 Java 泛型边界

java - 用于 AWT/Swing 的 Java JDK 1.7 中的 Apple Retina 显示支持

java - Android 不支持 Java v7+,所以我应该使用多个 catch 还是一个带有 instanceof 检查的 catch?