可能性のある複製:
arraylistの重複エントリを防止
特定のクラスCの配列リストがあります。
List<C> myList = new ArrayList<C>();
クラスCには2つの属性があります。
String str1;
String str2;
タイプCのオブジェクトをArrayList myListに追加するとき、オブジェクトのパラメーター(str1およびstr2)の値と一致するstr1およびstr2の値を持つオブジェクトがリストに既に存在するかどうかを確認したい追加しようとしています。
完全なリストを毎回繰り返し、パラメーター間の一致を確認することなく、これを行う効率的な方法はありますか?
クラス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の回答と組み合わせて使用すると最適です。
重複をチェックするか、一意の値を確認する必要がある場合は、リストではなく Set -のようなデータ構造を使用することを検討してください。
以下のいずれかを選択できます-
自動的に設定すると、一意の値のみが許可されます。以前に存在した値を追加しようとすると失敗します。
これが機能するためには、equals
とhashcode
をオーバーライドして、オブジェクトを比較する方法をSet
に伝える必要があることに注意してください。このステップは JavaでequalsとhashCodeをオーバーライドするときに考慮すべき問題は?
if (yourList.contains(Object object))
{
// do not add
}