Хорошим решением было бы собрать все наборы вместе, сосчитать частоту каждого элемента и сохранить только те, которые появляются дважды
Использование потоков
- поток с3 набора
- поток всех элементов из 3 наборов объединенных
- построение карты
- итерация по парам
- сохранение единиц со значением == 2
- сохранить только ключ
- собрать в набор
static <T> Set<T> intersectionTwoButNotThree(Set<T> s1, Set<T> s2, Set<T> s3) {
return Stream.of(s1, s2, s3)
.flatMap(Set::stream)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(entry -> entry.getValue() == 2)
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
}
С петлями
static <T> Set<T> intersectionTwoButNotThree(Set<T> s1, Set<T> s2, Set<T> s3) {
Map<T, Integer> map = new HashMap<>();
for (T elt : s1)
map.merge(elt, 1, Integer::sum); // sum previous value and 1
for (T elt : s2)
map.merge(elt, 1, Integer::sum); // sum previous value and 1
for (T elt : s3)
map.merge(elt, 1, Integer::sum); // sum previous value and 1
Set<T> set = new HashSet<>();
for (Map.Entry<T, Integer> e : map.entrySet())
if (e.getValue() == 2)
set.add(e.getKey());
return set;
}