【问题标题】:Java 7 : java.lang.IllegalArgumentException: Comparison method violates its general contractJava 7:java.lang.IllegalArgumentException:比较方法违反了一般合同
【发布时间】:2018-12-02 00:23:14
【问题描述】:

我正在将我们的项目升级到 java 7。我遇到了 Collections.sort() 的 Illegal Argument 异常。我知道异常的原因是 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() 方法,认为如果 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;
    };
}

【问题讨论】:

  • 有没有可能o1.dependsOn(o2)o2.dependsOn(o1) 都是真的?
  • 除非我们看到 dependsOnisLookup 方法在这里做了什么,否则很难评论。
  • 不能代表您的具体示例,但请确保您的比较函数尊重严格弱排序的概念。也就是说,如果 a a 和类似的东西。
  • @Henry 可能会针对您的具体情况确定它。如果 o1 和 o2 都相互依赖,如果使用 (o1, o2) 调用,比较器将返回 o1 大于 o2,但如果使用 (o2, o1) 调用,比较器将返回 o2 更大,这完全混淆了排序算法.
  • 张贴SSCCE 清楚地显示问题。

标签: java java-7


【解决方案1】:

你是不是缺少“.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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多