能否简单地解释一下为什么这段代码会抛出异常“Comparison method violates its general contract!”,以及如何修复它?
private int compareParents(Foo s1, Foo s2) {
if (s1.getParent() == s2) return -1;
if (s2.getParent() == s1) return 1;
return 0;
}
能否简单地解释一下为什么这段代码会抛出异常“Comparison method violates its general contract!”,以及如何修复它?
private int compareParents(Foo s1, Foo s2) {
if (s1.getParent() == s2) return -1;
if (s2.getParent() == s1) return 1;
return 0;
}
您不能像这样比较对象数据:s1.getParent() == s2
- 这将比较对象引用。您应该为Foo类覆盖equals函数
,然后像这样进行比较s1.getParent().equals(s2)
`If A>B And B>C then A has to be greater than A has to greater than C`
` -Djava.util.Arrays.useLegacyMergeSort=true `
`
Foo s1 = new Foo();
Foo s2 = new Foo();
Foo s3 = new Foo();
s1.setParent(s2);
s2.setParent(s3);
s3.setParent(s1);
compareParents(s1, s2); // returns -1
compareParents(s2, s3); // returns 1
compareParents(s1, s3); // returns 1
`
我遇到了同样的问题,但我已经解决了它。
//This this your code
private int compareParents(Foo s1, Foo s2) {
if (s1.getParent() == s2) return -1;
if (s2.getParent() == s1) return 1;
return 0;
}
违规操作是将不同的事物进行比较。
//acceptable
compare between s1.getParent() and s2.getParent()
//acceptable
compare between s1 and s2
//NOT acceptable
compare between s1 and s2.getParent()
//NOT acceptable
compare between s1.getParent() and s2
//My code:
private void sortBasedOnX(){
//addresses is a list of addresses where each address has X and Y
addresses.sort((o1, o2) -> {
String a = o1.getAddress().getX();
String b = o2.getAddress().getY(); //<-- this is supposed to be getX
return Integer.parseInt(a)-Integer.parseInt(b);
});
}
//acceptable
compare between o1.getAddress().getX() and o1.getAddress().getX()
//acceptable
compare between o1.getAddress().getY() and o1.getAddress().getY()
//NOT acceptable
compare between o1.getAddress().getX() and o1.getAddress().getY()
//NOT acceptable
compare between o1.getAddress().getX() and o1.getAddress()
//NOT acceptable
compare between o1.getAddress().getX() and o1
s1.getParent().equals(s2)
而不是s1.getParent() == s2
。 - Freiheits1
是s2
的父节点,而s2
不是s1
的父节点。那么compareParents(s1, s2)
等于0
,但compareParents(s2, s1)
却等于1
。这没有意义。(此外,就像下面aix提到的那样,它也不具有传递性。) - mqp