Как пересечь несколько множеств?

У меня есть этот список:

private List<Set<Address>> scanList;

Таким образом, мой список содержит несколько сканирований, как вы можете видеть. После каждого сканирования я добавляю новый набор в список.

После того, как все проверки завершены, я хотел бы использовать только адреса, которые встречаются в каждом наборе, и помещать их в:

private List<Address> addresses;

Что-то вроде этого уже существует в Set/TreeSet/HashSet?

РЕДАКТИРОВАТЬ: после ответов, preserveAll() - правильный метод. Спасибо. Вот источник:

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);
}

Ответы

Ответ 1

См. "retainAll()".

Ответ 2

вы можете использовать retainAll(Collection<?> c), проверьте здесь

Замечание: эта операция называется пересечением.

Чтобы преобразовать его в List, вы можете использовать метод addAll(Collection<? extends E> c), который должен работать между всеми типами контейнеров.

например:

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

Ответ 3

С 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 имеет хотя бы один элемент в нем, конечно.