17

重複の可能性:
arraylistの重複エントリを防止します

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

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

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

String str1;
String str2;

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

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

4

3 に答える 3

40

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

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

  • HashSet

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

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

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

これを機能させるには、オブジェクトをオーバーライドequalsして比較する方法をhashcode指示する必要があることに注意してください。Setこのステップは、JavaでequalsとhashCodeをオーバーライドするときに考慮すべき問題について詳しく説明されています。

于 2013-01-07T08:50:42.320 に答える
19

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

例えば

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

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

于 2013-01-07T08:51:48.127 に答える
12
if (yourList.contains(Object object))
{
    // do not add
}
于 2013-01-07T08:51:30.633 に答える