0

コードの一部をデバッグする必要があるため、この例外 (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 がこの例外をスローするように、コード ブロックでどのような変更を行う必要がありますか。

4

2 に答える 2

6

これはおそらくあなたの問題です

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

順序が等しい場合、どちらが最初に Comparator に入るかによって異なる結果が得られますが、これは正しくありません。

契約は if A < B and B < C then A < C のようなものですが、あなたの場合、引数が渡される順序によってはこれが破られる可能性があります。

のようなものを試してください

return tas1.order -tas2.order;

これは、テスト データに重複がないため、再現できない理由も説明しています。テストデータにいくつかの重複を追加してみて、再現できるかどうかを確認してください(明らかに修正を適用する前に...)

于 2013-04-19T07:42:42.287 に答える