谁能简单地解释一下,为什么这段代码抛出一个异常,“比较方法违反了它的一般契约!”,以及我该如何修复它?
private int compareParents(Foo s1, Foo s2) {
if (s1.getParent() == s2) return -1;
if (s2.getParent() == s1) return 1;
return 0;
}
谁能简单地解释一下,为什么这段代码抛出一个异常,“比较方法违反了它的一般契约!”,以及我该如何修复它?
private int compareParents(Foo s1, Foo s2) {
if (s1.getParent() == s2) return -1;
if (s2.getParent() == s1) return 1;
return 0;
}
当前回答
编辑虚拟机配置对我很有用。
-Djava.util.Arrays.useLegacyMergeSort=true
其他回答
你不能像这样比较对象数据:s1.getParent() == s2 -这将比较对象引用。你应该重写Foo类的equals函数然后像这样比较它们s1.getParent()。equals(s2)
在我的例子中,它是无限排序。 也就是说,首先这条线根据条件向上移动,然后这条线向下移动到相同的位置。 我在最后添加了一个条件,明确地建立了行序。
编辑虚拟机配置对我很有用。
-Djava.util.Arrays.useLegacyMergeSort=true
只是因为这是我得到的当我谷歌这个错误,我的问题是我有
if (value < other.value)
return -1;
else if (value >= other.value)
return 1;
else
return 0;
>= other。Value(显然)实际上应该是Value > other。值,这样你就可以用相等的对象返回0。
如果compareParents(s1, s2) == -1,则期望compareParents(s2, s1) == 1。对于你的代码,这并不总是正确的。
具体来说,如果s1. getparent () == s2 && s2. getparent () == s1。 这只是可能出现的问题之一。