オブジェクトごとに 2 つのフィールドをループして手動で比較し、見つかったときに中断するよりも良い方法はありますか? より良い方法を探して、それはとても面倒に思えます。
あなたの懸念が保守性である場合、Fabian Steegが提案することを行うことができます(それが私がすることです)が、おそらく「最も効率的」ではありません(最初に配列をソートしてからバイナリ検索を実行する必要があるため)が、確かに最もクリーンですそしてより良いオプション。
効率性を重視する場合は、オブジェクト内のフィールドをハッシュとして使用し、HashMap をストレージとして使用するカスタム List 実装を作成できます。しかし、おそらくこれは多すぎるでしょう。
次に、データを入力する場所を ArrayList から YourCustomList に変更する必要があります。
お気に入り:
List list = new ArrayList();
fillFromSoap( list );
に:
List list = new MyCustomSpecialList();
fillFromSoap( list );
実装は次のようになります。
class MyCustomSpecialList extends AbstractList {
private Map<Integer, YourObject> internalMap;
public boolean add( YourObject o ) {
internalMap.put( o.getThatFieldYouKnow(), o );
}
public boolean contains( YourObject o ) {
return internalMap.containsKey( o.getThatFieldYouKnow() );
}
}
HashSet とほとんど同じですが、ここでの問題は、HashSet が hashCode メソッドの優れた実装に依存していることです。代わりに、あるオブジェクトを他のオブジェクトと等しくする「あなたが知っているそのフィールド」をハッシュとして使用します。
もちろん、最初から List を実装するのは、上記の私のスニペットよりもはるかにトリッキーです。そのため、Fabian Steegの提案の方が実装がより適切で簡単であると言います (ただし、このようなものの方が効率的です)。
最後に何をしたか教えてください。