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。这违反了约定,因此引发异常。

库能够检测到这一点并让您知道,而不是表现得异常,这真是太好了。

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

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

相关文章:

Java:使用方法和比较器将一个数组排序到另一个数组

Java 实现 PriorityQueue - 当没有提供 Comparator 时

java - SSL 引擎 : TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 不支持指定的密码

java - 如何读取Json文件中超过1个JsonObject

java - JTable 使用 Clipboard 和 AbstractAction 进行复制和粘贴

java - 为 Java TreeSet 创建比较器类

java - 如何使用 Java 客户端在 WCF 中创建的 SOAP 1.2 Web 服务?

java - 三角形未在 OSX 上的 OpenGL 2.1 中绘制

java - 比较方法抛出一般契约异常

java - TreeSet 的比较器无法按预期工作