【发布时间】:2012-10-18 18:32:25
【问题描述】:
我有一个应用程序可以生成许多数组列表,存储在一个集合中。所有的数组列表总是有一个共同的元素。
我需要弄清楚哪个是共同元素。我用两个列表和List.contains(...) 管理了这个,但需要将它扩展到多个列表。
我该怎么做?
【问题讨论】:
我有一个应用程序可以生成许多数组列表,存储在一个集合中。所有的数组列表总是有一个共同的元素。
我需要弄清楚哪个是共同元素。我用两个列表和List.contains(...) 管理了这个,但需要将它扩展到多个列表。
我该怎么做?
【问题讨论】:
如果您将retainAll() 的所有List 转换为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 并完成。
【讨论】: