2017-01-18 4 views
0

私は、ツリーセットを初期化するために自己定義コンパレータを使用し、最小ヒープにしました。 1、2、3などの小さな数字の重複を削除するには問題ありません。しかし、数字が大きい場合、重複はツリーセットに残ります。ここに私のコードだ:何かが私のコンパレータと間違っているようコンパイラはツリーセット内の数値の重複を削除しません

public class Test { 
    public static void main(String[] args) { 
      Set<Integer> treeset = new TreeSet<>(new MyComparator()); 
      Integer[] array = new Integer[args.length]; 
      for (int i = 0 ; i < args.length ; i ++) { 
        array[i] = Integer.valueOf(args[i]); 
        treeset.add(array[i]); 
      } 
      for (Integer i : treeset) { 
        System.out.print(i + " "); 
      } 
    } 

    public static class MyComparator implements Comparator<Integer> { 
      @Override 
      public int compare(Integer i1, Integer i2) { 
        if (i1 < i2) { 
          return -1; 
        } else if (i1 == i2) { 
          return 0; 
        } else { 
          return 1; 
        } 
      } 
    } 

}

私はJavaのテスト-2147483647 -2147483647 1 1をすれば、私は-2147483647 -2147483647 1を得るに思えます。私はデバッグしようとしました。 -2147483647と-2147483647を比較すると、0を返す代わりにcompareメソッドが1を返します。前もって感謝します!

答えて

1

Integerのインスタンスと==を比較していますが、オブジェクトに適用された==は、同じインスタンスである場合のみ比較します。あなたのケースでは、i1i2は同じ値を持っていても2つの異なるインスタンスです。

のようにコンテンツを比較するequalsメソッドを使用します。

... 
       } else if (i1,equals(i2)) { 
         return 0; 
... 

なぜそれが小さな数字では動作しない:小さな整数(デフォルトでは127 -128)をすることを避けるためにIntegerクラスによってキャッシュされていますこれらが必要になるたびに新しいインスタンスを作成します。詳細:Integer.valueOf(int)

+0

私はequals()に変更されました。ありがとうございました! –

0

valueOf()を使用してIntegerを作成すると、-128〜127の値がキャッシュされます。これは、演算子==を使用してこれらの値の範囲を比較すると、両方のオブジェクトが同じ整数値を持つ場合、trueを返します。 -128より小さく127より大きい整数値が機能しない場合、比較は同じ値を持つオブジェクトに対してfalseを返します。したがって、常に正しく動作させたい場合は、==の代わりにequals()メソッドを使用して比較してください。

+0

素晴らしい説明!ありがとうございました! –

関連する問題