java - "Comparison method violates its general contract!"

标签 java comparator

谁能简单解释一下,为什么这段代码会抛出异常,“比较方法违反了它的一般约定!”,我该如何解决?

private int compareParents(Foo s1, Foo s2) {
    if (s1.getParent() == s2) return -1;
    if (s2.getParent() == s1) return 1;
    return 0;
}

最佳答案

您的比较器不具有传递性。

AB的父级,BC的父级。既然A > BB > C,那么一定是A > C。但是,如果在 AC 上调用比较器,它将返回零,即 A == C。这违反了契约(Contract),因此引发了异常。

图书馆很高兴能检测到这一点并让你知道,而不是行为不规律。

满足 compareParents() 中传递性要求的一种方法是遍历 getParent() 链,而不是只查看直接祖先。

关于java - "Comparison method violates its general contract!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8327514/

相关文章:

java - 无法在 Java 中使用自定义比较器

java - 无法引用以不同方法定义的内部类中的非最终变量-请帮助我,我是新手

java - Liberty 空指针异常

java - 从属性/XML 文件中设置 web.xml 中的上下文参数

c++ - C++ Map 中结构键的比较运算符

java - 根据出现次数打印

java - 实现Java优先级队列

java - eclipse 库包 - 无法从某些库中导出包

java - 是否有使用 WordNet 的任何简单的基于 Java 的词义消歧?

java - 比较方法违反了它的一般契约! Java7比较器