私はArrayList<>
年代は(O(1)
対O(n)
)を検索するための最速であり、LinkedList<>
年代は&削除(O(1)
対O(n)
)を挿入するための最速であることを理解しています。多くのリストの共通要素をチェックする最適な方法は?
私の質問は、これら2つの組み合わせを使用する場合、共通の要素に対して多くのリスト(> 2)をチェックする最適な方法は何ですか?
電流法 3つのリストを使用して と反復法は:
out:
for(int a = 0; a < list1.size(); a++) {
for(int b = 0; b < list2.size(); b++) {
for(int c = 0; c < list3.size(); c++) {
if(list1.get(a) == list2.get(b) && list1.get(a) == list3.get(c)) {
System.out.println(list1.get(a)); // list2.get(b) or list3.get(c) could have been subbed
break out;
}
}
}
}
これは効率のために最適化することができますか?
EDIT多くの有用な応答のための
感謝:) 何が最適に動作することが判明すると、一覧.retainAll()
機能を使用することでした。
また、3つのリストの共通要素を見つけるために、以下の方法を改良しました。
list1.retainAll(list2);
list1.retainAll(list3);
for(int i : list1) {
System.out.println(i);
}
まず、同じ要素を3回アクセスし、オブジェクトにlist1.get(a)を格納すると、2つのリストアクセスを獲得します –
2つの内部ループの代わりにList.containsを使用します。 – Eran
私はマップを使用して参照を数えます。リストがn個あり、完了している場合は、マップのnのカウントを持つすべてのエントリが共通の要素を表します。これは、要素が各リストに対して一意であることを前提としています(二重項目はありません)。 – Fildor