如何交叉多组?

时间:2010-10-24 16:42:06

标签: java set intersection

我有这个清单:

private List<Set<Address>> scanList;

所以我的列表包含多个扫描,如您所见。 每次扫描后,我都会在列表中添加新的设置。

完成所有扫描后,我想只获取每组中出现的地址并将其放入:

private List<Address> addresses;

Set / TreeSet / HashSet中是否存在类似的内容?

编辑:在回答之后,retainAll()是正确的方法。谢谢。 这是来源:

Set<Address> addressCross = scanList.get(0);
for (int i = 1; i < scanList.size(); i++) {
    addressCross.retainAll(scanList.get(i));
}   
for (Address address : addressCross) {
    addresses.add(address);
}

4 个答案:

答案 0 :(得分:16)

您可以使用retainAll(Collection<?> c),查看here

附注:该操作称为交叉点

要将其转换为List,您可以使用适用于各种容器的方法addAll(Collection<? extends E> c)

例如:

ArrayList<Address> list = new ArrayList<Address>();
list.addAll(yourSet);

答案 1 :(得分:11)

参见“retainAll()”。

答案 2 :(得分:6)

使用Guava,你可以这样做:

Set<Address> intersection = scanList.get(0);
for (Set<Address> scan : scanList.subList(1, scanList.size())) {
  intersection = Sets.intersection(intersection, scan);
}
List<Address> addresses = Lists.newArrayList(intersection);

这将创建scanList中所有集合的交集视图,然后将交集中的地址复制到List。当然,您需要确保scanList中至少包含一个元素。

答案 3 :(得分:0)

这里还有一个不错的解决方案:https://stackoverflow.com/a/38266681/349169

Set<Address> intersection = scanList.stream()
    .skip(1) // optional
    .collect(()->new HashSet<>(scanList.get(0)), Set::retainAll, Set::retainAll);