Пересечение двух множеств из трех заданных множеств? - PullRequest
0 голосов
/ 07 октября 2019

Я должен написать алгоритм, который находит пересечение двух множеств из трех заданных множеств. Например, если элемент существует в двух из трех наборов, это хорошо, но если элемент находится во всех трех наборах, его не следует добавлять

Ответы [ 3 ]

0 голосов
/ 07 октября 2019

Хорошим решением было бы собрать все наборы вместе, сосчитать частоту каждого элемента и сохранить только те, которые появляются дважды

Использование потоков

  • поток с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;
}
0 голосов
/ 07 октября 2019

Ниже моя попытка

public class Test {

    List<Set> sets = new ArrayList<>();
    Set<String> one = new HashSet<>();
    Set<String> two = new HashSet<>();
    Set<String> thr = new HashSet<>();

    enum EStatus{
        IT_IS_GOOD,
        SHOULD_NOT_BE_ADDED,
        EPIC_FAIL
    }

    public static void main(String[] args) {
        Test mainT = new Test();
        mainT.prepareData();
        System.out.println(mainT.doStuff("three"));
    }


    public EStatus doStuff(String element){
        for(int i = 1; i <= 3; i++){
            Set<String> intersectionOfTwo = new HashSet<>(sets.get(i-1));
            intersectionOfTwo.retainAll(sets.get(i % 3));
            if(intersectionOfTwo.contains(element)){
                Set<String> intersectionOfThree  = new HashSet<>(intersectionOfTwo);
                intersectionOfThree.retainAll(sets.get((i + 1) % sets.size()));
                if(intersectionOfThree.contains(element)){
                    return EStatus.SHOULD_NOT_BE_ADDED;
                }else{
                    return EStatus.IT_IS_GOOD;
                }
            }
        }
        return EStatus.EPIC_FAIL;
    }

    public void prepareData(){
        one.add("one");
        one.add("two");
        one.add("three");
        two.add("two");
        two.add("three");
        thr.add("three");
        thr.add("four");
        sets.add(one);
        sets.add(two);
        sets.add(thr);
    }
}
0 голосов
/ 07 октября 2019
  1. Создание хеш-карты
  2. Итерация по каждому набору, добавление элемента в качестве ключа со значением 1, если ключ еще не в хэш-карте, если ключ увеличения значения хеш-карты равен единице.
  3. Выполните итерацию по hashmap и создайте свой результирующий набор с ключами со значением два.
...