java - 另一个 "Comparison method violates its general contract!"

标签 java java-7 comparator illegalargumentexception

作为实习的一部分,我被要求调查一个错误。 一段代码在抛出

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/

相关文章:

java - 如何使用getResources方法正确显示图片?

java - ((LocalBinder)service) 是什么意思?

Java - 逐行将字符串写入文件与单行/无法将字符串转换为字符串[]

java - 使用ant和Java 1.7编译问题

c++ - 具有自定义结构的 <set> 包含重复项

java - 创建对象和值之间映射的最小堆

java - 按列表中某些对象中缺少的对象字段对列表进行排序

java - 在 Windows 计算机上使用 Java Swing SystemLookAndFeel 会导致带有 JTextPanes 的 CachedPainter 中出现内存泄漏

java - JComboBox 类型不是泛型

java - 为什么 java 1.7 中的字体与 1.6 中的字体不同?