オブジェクトAの 'List'または 'Map'、...が必要です。このリストは別のArrayListから追加されます。 Aのid
パラメーターが等しい場合、オブジェクトAは別のオブジェクトと等しいと見なされます。
私の問題は、リストに存在しないオブジェクトのみを追加することです。実装の2つの選択肢の間で疑問に思います。 ArrayListまたはHashMapの使用
1. ArrayList:
for (A a: source) {if (! (a in ArrayList)) addToArrayList();}
2. HashMap <id, A>
for (A a: source) {hasmap.put (a.id, a)}
多数のオブジェクト(1000個以上のオブジェクト、またはより多くのオブジェクト)を追加する速度が向上します。私の問題により良いパターンはありますか?
まず、四肢に出て、これらが2つの完全に異なるデータ構造であると述べます。List
は要素の線形表現、およびMap
はキーペア値を扱います。
私の直感では、List
とSet
のどちらかを選択しようとしています。
unique要素のみを入力する場合、またはより簡潔に配置する場合、一意の値のみを考慮する場合は、何らかの種類のSet
が最適ですベット-注文を気にしない場合はおそらくHashSet
。 追加、削除、包含、サイズなどの基本操作に対してO(1)時間 を提供します。
(興味深いことに、HashSet
はHashMap
によって支えられていますが、ArrayList
と同様のインターフェースを提供します。)
ArrayList
には、すべての検索でO(n)パフォーマンスがあるため、n回の検索のパフォーマンスはO(n ^ 2)です。
HashMap
は、すべての検索で(平均で)O(1))パフォーマンスがあるため、n回の検索のパフォーマンスはO(n)になります。
HashMap
は最初は遅くなり、より多くのメモリを使用しますが、nの値が大きい場合は高速になります。
ArrayList
がO(n)パフォーマンスを持っている理由は、すべての項目がリストにないことを確認するために挿入ごとにチェックする必要があるためです。n回の挿入を行います、したがって、操作全体ではO(n ^ 2)です。
HashMap
のパフォーマンスがO(1))である理由は、ハッシュアルゴリズムがすべてのキーに対して同じ時間を要し、キーを見つけるためのルックアップにも一定の時間がかかるためです。ハッシュテーブルがその負荷係数を超えて再割り当てする必要がある場合、およびそれが一定である理由on avarage。
最後に、あなたの質問に答えるために、私のアドバイスはHashMap
を使用することです。