java.lang.IllegalArgumentException:比较方法违反了其一般合同(不可重复)

时间:2013-04-19 07:37:38

标签: java collections comparator

我正在尝试重现此异常(java.lang.IllegalArgumentException:比较方法违反了它的一般合同!),因为我需要调试一段代码,但下面的代码永远不会抛出它,

try {
  ArrayList al = new ArrayList();
  for (int i = 1; i <= 36; i++) {
    TypeAdapterSort t = new TypeAdapterSort();
    t.order = i;
    al.add(t);
  }
  System.out.println(al.size());
  Collections.sort(al, new Comparator() {
    public int compare(Object o1, Object o2) {
      TypeAdapterSort tas1 = (TypeAdapterSort) o1;
      TypeAdapterSort tas2 = (TypeAdapterSort) o2;
      if (tas1.order < tas2.order)
        return -1;
      else
        return 1;
    }
  });

} catch (Exception e) {
  System.out.println(e);
}

另外,当我检查JDK代码时,只有当要排序的集合的大小大于32时,Collections.sort方法才会抛出此异常。应该在代码块中进行哪些更改,以便Collections.sort抛出此异常。

2 个答案:

答案 0 :(得分:6)

这可能是你的问题

if (tas1.order < tas2.order)
    return -1;
else
    return 1;

如果顺序相等,你会得到一个不同的结果,这取决于首先进入比较器的结果,这是不对的。

合同类似于A&lt; B和B&lt; C然后A&lt; C,但在你的情况下,这可以根据参数的传递顺序来打破。

尝试类似

的内容
return tas1.order -tas2.order;

这也解释了为什么您无法重现它,因为您的测试数据永远不会重复。尝试在测试数据中添加一些dupes并查看是否可以重现(在明确应用修复之前......)

答案 1 :(得分:2)

如果对象相等,则永远不会返回0.库足够智能,可以检测到此