How to intersect multiple sets?
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.
vale4674
Updated on July 09, 2022Comments
-
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); }