我有一个生成许多数组列表的应用程序,存储在一个集合中。所有的数组列表总是有一个共同的元素。
我需要弄清楚哪个是共同元素。我用两个列表和使用来管理它,List.contains(...)
但需要将它扩展到许多列表。
我怎样才能做到这一点?
如果您retainAll()
将所有的List
's 都添加到 a 中Set
,您最终将得到集合中的所有公共元素。
Set set = new HashSet();
for ( List list : yourLists )
{
set.addAll( list );
}
for ( List list : yourLists )
{
set.retainAll( list );
}
这几乎可以简单地优化为只遍历列表一次(并使用等于所有现有列表的大小加上第一个列表的额外大小的堆空间),但出于说明目的,这个版本更好......
干杯,
使用将每个数组列表中的唯一元素映射到其频率的哈希表(即,即使同一数组列表中的元素多次出现,它也必须只增加一次)。遍历哈希表,直到值等于数组列表的数量。对应的键就是我们要找的元素。
使用retainAll(),这样在每一步你都会有列表的交集
list1.retainAll(list2);
list1.retainAll(list3);
所以这种方式list1
将是所有元素的交集。现在,如果要复制公共元素,则需要将最终列表添加到 Set 并完成。