コレクションに格納された多くの配列リストを生成するアプリケーションがあります。すべての配列リストには常に共通の要素があります。
どの要素が共通しているかを突き止める必要があります。これを2つのリストと使用で管理しましList.contains(...)
たが、これを多くのリストにスケーリングする必要があります.
これどうやってするの?
すべてretainAll()
のList
を aSet
にすると、セット内のすべての共通要素になります。
Set set = new HashSet();
for ( List list : yourLists )
{
set.addAll( list );
}
for ( List list : yourLists )
{
set.retainAll( list );
}
これは、リストを 1 回だけトラバースするように最適化することはほとんど自明ですが (既存のすべてのリストのサイズに最初のリストの追加サイズを加えたサイズに等しいヒープ領域を使い果たします)、説明目的では、このバージョンの方が優れています...
乾杯、
各 arraylist 内の一意の要素をその頻度にマップするハッシュテーブルを使用します (つまり、同じ arraylist 内に複数の要素が存在する場合でも、一度だけインクリメントする必要があります)。値が配列リストの数と等しくなるまで、ハッシュテーブルを反復処理します。対応するキーは、探している要素です。
keepAll()を使用して、各ステップでリストの交差が発生するようにします
list1.retainAll(list2);
list1.retainAll(list3);
したがって、この方法list1
はすべての要素の交差点になります。共通要素を複製する場合は、最終的なリストを Set に追加して完了させる必要があります。