0

コレクションに格納された多くの配列リストを生成するアプリケーションがあります。すべての配列リストには常に共通の要素があります。

どの要素が共通しているかを突き止める必要があります。これを2つのリストと使用で管理しましList.contains(...)たが、これを多くのリストにスケーリングする必要があります.

これどうやってするの?

4

3 に答える 3

2

すべてretainAll()Listを aSetにすると、セット内のすべての共通要素になります。

Set set =  new HashSet();
for ( List list : yourLists ) 
{ 
    set.addAll( list );
} 
for ( List list : yourLists )
{
    set.retainAll( list );
}

これは、リストを 1 回だけトラバースするように最適化することはほとんど自明ですが (既存のすべてのリストのサイズに最初のリストの追加サイズを加えたサイズに等しいヒープ領域を使い果たします)、説明目的では、このバージョンの方が優れています...

乾杯、

于 2012-10-18T18:33:48.510 に答える
1

各 arraylist 内の一意の要素をその頻度にマップするハッシュテーブルを使用します (つまり、同じ arraylist 内に複数の要素が存在する場合でも、一度だけインクリメントする必要があります)。値が配列リストの数と等しくなるまで、ハッシュテーブルを反復処理します。対応するキーは、探している要素です。

于 2012-10-18T18:44:26.523 に答える
0

keepAll()を使用して、各ステップでリストの交差が発生するようにします

list1.retainAll(list2);
list1.retainAll(list3);

したがって、この方法list1はすべての要素の交差点になります。共通要素を複製する場合は、最終的なリストを Set に追加して完了させる必要があります。

于 2012-10-18T18:33:31.240 に答える