7

私の質問は次Collectionのとおりです。コレクションに番号を追加して一意性を維持するかどうかを知るために、番号がに含まれているかどうかをすばやく判断する方法は何ですか。私がそれを助けることができれば、私はむしろリストを繰り返したくありません。

私はList<Integer>と呼ばれていnumberListます。一意の整数を格納し、重複を追加しないようにしたい。私はこのようなことをしたいと思います:

private void add(int number) {
  if (!numberList.contains(number)) {
    numberList.add(number);
  }
}

numberListただし、オブジェクトのリストが含まれているため、これは明らかに機能しませIntegerん。したがって、数に関係なく、それぞれが一意のオブジェクトです。

ありがとう!

4

2 に答える 2

13

1つは、整数をSet<Integer>などに格納することHashSet<Integer>です。セットは重複を許可しません。

編集
また、コレクションのcontains(...)メソッドは、オブジェクトのequals(...)メソッドを使用して、コレクションによって保持されているかどうかを確認します。したがって、コレクションとしてリストを使用する必要がある場合は、上記のメソッドでも重複を防ぐことができます。これを自分でテストすると、そうなっていることがわかります。

例えば:

  List<Integer> numberList = new ArrayList<Integer>();
  int[] myInts = {1, 1, 2, 3, 3, 3, 3, 4};
  for (int i : myInts) {
     if (!numberList.contains(i)) {
        numberList.add(i);
      }
  }

  System.out.println(numberList);

戻ります:[1, 2, 3, 4]

また、HashSetsで考えられる問題の1つは、順序付けされていないことです。したがって、順序付けが重要な場合は、他の種類の順序付けされたセットのいずれかを使用することを検討してください。

于 2012-07-01T22:13:01.910 に答える
3

最もコンパクトな形はBitSet?無制限に拡張できるため、ストレージの面で効率的です。また、ストレージを不必要に使用することもありません。

マルチスレッド環境で作業していますか?もしそうなら、より良い/より効率的なかもしれない他の構造があります。

于 2012-07-01T22:22:46.620 に答える