作为实习的一部分,我被要求调查一个错误。 一段代码在抛出
java.lang.IllegalArgumentException: Comparison method violates its general contract!
自定义 Comparator
通过查看所述自定义类的 long
成员变量来比较两个自定义类:
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
此自定义类的equals
方法查看此自定义类的String
成员变量。
我们在重现这种行为时遇到了麻烦。
我下意识的 react 是将自定义 Comparator
中的 return 语句替换为 return v2.compareTo(v1);
,
但我的团队怀疑这能否解决问题。
谁能提供任何见解?
Arrays.sort(anArray, new Comparator<ACustomClass>() {
@Override
public int compare(ACustomClass o1, ACustomClass o2) {
long v1 = o1.getALong();
long v2 = o2.getALong();
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
}});
最佳答案
我看不出所提供的比较器有任何明显的错误。 (而且我对提议的修复程序持怀疑态度:它们对我来说“闻起来”有巫毒编程的味道。)
但是如果 ACustomClass
类的 aLong
属性是可变的……并且它在您排序时改变了……那么这可能会导致排序代码认为比较器违反了契约(Contract)。
所以...检查这是否可能是并发问题,其中一个线程正在改变另一个线程试图排序的数组中的对象。
We spent quite a bit of time on this w/ the debugger...lots of different test cases. Couldn't get the behavior to be reproduced.
我会将其视为指向并发问题的证据......
关于java - 另一个 "Comparison method violates its general contract!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18115506/