ここで人々が反対票を投じた理由はわかりません。
あなたは絶対にセットが欲しいです。要件が「セット」の定義と機能を満たしているだけでなく、セットの実装は、ハッシュまたは比較識別によって重複をすばやく識別するように設計されています。
デリゲートと述語を取る List 実装があるとしましょう:
リスト uniquePeople = 新しい PredicatedList(新しい ArrayList(),UnqiuePersonPredicate.getInstance())
public class PredicatedList<T> implements List<T> {
private List<T> delegate = null;
private Predicate<T> predicate;
public PredicatedList<List<T> delegate, Predicate p) {
this.delegate = delegate;
this.predicate = p;
}
// implement list methods here and apply 'p' before calling your insertion functions
public boolean add(Person p) {
if(predicate.apply(p))
delegate.add(p);
}
}
これが機能するには、リストを反復処理して等しい要素を見つける述語が必要です。これは O(N) 操作です。HashSet を使用すると、O(1) < n < O(N) になります。償却された ID チェックは負荷係数 * N です。そして、通常は O(1) にかなり近くなります。
TreeSet を使用すると、O(log(n)) が得られます。これは、要素が ID でソートされ、バイナリ検索に log(n) 時間しか必要ないためです。
「名前」または必要なものに基づいて hashCode()/equals を定義し、HashSet を使用するか、TreeSet を使用して Comparable/Comparator を定義します。
戻り値の型がリストでなければならない場合は、次のようにします。uniquePeople.add(...);
リストの人々 = new LinkedList(uniquePeople);