如何交叉多组?

val*_*674 20 java intersection set

我有这个清单:

private List<Set<Address>> scanList;
Run Code Online (Sandbox Code Playgroud)

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

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

private List<Address> addresses;
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 16

你可以使用retainAll(Collection<?> c),在这里查看

旁注:该操作称为交集.

要将它转换为a,List您可以使用addAll(Collection<? extends E> c)应该在各种容器之间工作的方法.

例如:

ArrayList<Address> list = new ArrayList<Address>();
list.addAll(yourSet);
Run Code Online (Sandbox Code Playgroud)


Lav*_*let 11

请参阅"retainAll()".


Col*_*inD 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);
Run Code Online (Sandbox Code Playgroud)

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

  • @ user25029:目标是创建仅包含出现在_all_集中的那些元素的列表。因此,如果输入中有任何不包含任何相同元素的集合(即它们的交集为空),则最终结果必须为空。 (2认同)