2012-03-09 13 views
0

私のJavaプログラムでは、2D配列を持つTreeSetを持っています。しかし、私はその中に重複したくないので、TreeSetのcontains()メソッドを使うために、Comparatorを実装するクラスを作成して、重複を追加するかどうかを調べることにしました。しかし、contains()は時々正しく動作しないようです。ここにコンパレータがあります:2D配列を持つTreeSetのコンパレータを作成する - Java

public class ComparatorMatrix implements Comparator<int[][]> { 

public int compare(int[][] matrix1, int[][] matrix2) { 
    if(Arrays.deepEquals(matrix1, matrix2)) {return 0;} 

    return -1; 
} 

私はequals()メソッドを実装していませんでしたし、それを行う方法はありません。私は何をすべきか?

+2

コンパレータは、項目が小さいか大きい場合は負または正の値を返します。あなたは決して正の価値を返すことはありません。コンパレータによって定義されたa aでなければなりません。自己一貫性を持たせる必要があります。それは単に等しいの0を返すことはできません。残りの部分を適切に処理する必要があります。 –

+0

ツリーセットが正規のセットを超えているのはなぜですか?次に等価/ハッシュコードを定義するだけで、行列が別のmatirxより小さいか大きいかを心配する必要はありません – RedDeckWins

+0

TreeSetはcontains()操作のlog(n)複雑さを持っています。私はできるだけ早くそれが必要です。 –

答えて

0

ComparatorMatrixはComparatorの定義を満たさないため、問題が発生しています。 Carl Manasterが述べたように、compare(a、b)が-1を返す場合、あなたは正しく返す必要があります。compare(b、a)は1を返さなければならないか、TreeSet内では動作しません。

注文の定義がない場合、別のHashSetを使用する必要があります。次に、hashCodeとequalsを実装するだけです。 equalsは既に実装されています。 hashCodeをキャッシュするオブジェクト内に行列を簡単にラップすることができるので、毎回それを再計算する必要はありません。

関連する問題