web-dev-qa-db-ja.com

ArrayListへの重複オブジェクトの追加を防ぐ方法

可能性のある複製:
arraylistの重複エントリを防止

特定のクラスCの配列リストがあります。

List<C> myList = new ArrayList<C>();

クラスCには2つの属性があります。

String str1;
String str2;

タイプCのオブジェクトをArrayList myListに追加するとき、オブジェクトのパラメーター(str1およびstr2)の値と一致するstr1およびstr2の値を持つオブジェクトがリストに既に存在するかどうかを確認したい追加しようとしています。

完全なリストを毎回繰り返し、パラメーター間の一致を確認することなく、これを行う効率的な方法はありますか?

16
London guy

クラスCのequalsメソッドをオーバーライドする必要があります。

例えば.

public boolean equals(Object c) {
    if(c !instanceof C) {
        return false;
    }

    C that = (C)c;
    return this.str1.equals(that.getStr1()) && this.str2.equals(that.getStr2());
}

次に、myList.contains(viz)を呼び出して、リストにすでに等しいオブジェクトが含まれているかどうかを確認できます。

これはテストされていません。追加のエラー処理が必要になる場合があります。

このようにequalsメソッドをオーバーライドする場合は、hashcode()メソッドも必ずオーバーライドする必要があります。参照: http://www.technofundo.com/tech/Java/equalhash.html

Edit:コメントで指摘したように、セットの実装はより効率的になりますが、equals/hashcodeメソッドをオーバーライドする必要があります上記の例は、上記のKarthiksの回答と組み合わせて使用​​すると最適です。

19
cowls

重複をチェックするか、一意の値を確認する必要がある場合は、リストではなく Set -のようなデータ構造を使用することを検討してください。

以下のいずれかを選択できます-

  • HashSet

    • 高速アクセス-O(1)アクセスは大まかに言って。
    • ソートされていません
    • ベースストレージとして使用されるハッシュテーブル。
  • TreeSet

    • 遅いアクセス(HashSetに対して)-O(log(n))
    • 値は自動的にソートされます。
    • ベースストレージとして使用される赤黒ツリー。

自動的に設定すると、一意の値のみが許可されます。以前に存在した値を追加しようとすると失敗します。

これが機能するためには、equalshashcodeをオーバーライドして、オブジェクトを比較する方法をSetに伝える必要があることに注意してください。このステップは JavaでequalsとhashCodeをオーバーライドするときに考慮すべき問題は?

39
Karthik T
if (yourList.contains(Object object))
{
    // do not add
}
12
Romczyk