Ответ 1
См. "retainAll()".
У меня есть этот список:
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);
}
См. "retainAll()".
вы можете использовать retainAll(Collection<?> c)
, проверьте здесь
Замечание: эта операция называется пересечением.
Чтобы преобразовать его в List
, вы можете использовать метод addAll(Collection<? extends E> c)
, который должен работать между всеми типами контейнеров.
например:
ArrayList<Address> list = new ArrayList<Address>();
list.addAll(yourSet);
С 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
имеет хотя бы один элемент в нем, конечно.