How to intersect multiple sets?

20,063

Solution 1

See "retainAll()".

Solution 2

you can use retainAll(Collection<?> c), check it out here

A side note: that operation is called intersection.

To convert then it to a List you can use the method addAll(Collection<? extends E> c) which should work between all kinds of containers.

eg:

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

Solution 3

With Guava, you could do it like this:

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

This creates a view of the intersection of all the sets in the scanList and then copies the addresses in the intersection into a List. You would need to ensure your scanList has at least one element in it, of course.

Share:
20,063
vale4674
Author by

vale4674

Updated on July 09, 2022

Comments

  • vale4674
    vale4674 almost 2 years

    I have this list:

    private List<Set<Address>> scanList;
    

    So my list contains multiple scans as you can see. After each scan I add new set into the list.

    After all scans are finished I would like to take only the addresses that occur in every set and put it into:

    private List<Address> addresses;
    

    Does something like this already exists in Set/TreeSet/HashSet?

    EDIT: after answers, retainAll() is the right method. Thank you. Here is the source:

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