Как пересечь несколько множеств? - PullRequest
20 голосов
/ 24 октября 2010

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

private List<Set<Address>> scanList;

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

После того, как все сканирования завершены, я хотел бы взять только адреса, которые встречаются в каждом наборе, и поместить его в:что-то подобное уже существует в 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);
}

Ответы [ 3 ]

16 голосов
/ 24 октября 2010

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

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

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

например:

ArrayList<Address> list = new ArrayList<Address>();
list.addAll(yourSet);
11 голосов
/ 24 октября 2010

См. "RetainAll ()".

6 голосов
/ 24 октября 2010

С Гуавой , вы можете сделать это так:

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 есть хотя бы один элемент.

...