Объединение и пересечение Java-множеств - PullRequest
0 голосов
/ 30 июня 2018

Какой самый простой способ сделать соединение или пересечение Set s в Java? Я видел некоторые странные решения этой простой проблемы (например, вручную итерируя два набора).

enter image description here enter image description here

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Вы можете достичь этого, используя Google's Guava library. Следующее объяснение приводится ниже с помощью примера:

    // Set a
    Set<String> a = new HashSet<String>();
    a.add("x");
    a.add("y");
    a.add("z");

    // Set b
    Set<String> b = new HashSet<String>();
    b.add("x");
    b.add("p");
    b.add("q");

Теперь вычисляем пересечение двух множеств в Java:

Set<String> intersection = Sets.intersection(a, b);
System.out.printf("Intersection of two Set %s and %s in Java is %s %n",
                a.toString(), b.toString(), intersection.toString());

Выход: Intersection of two Set [z, y, x] and [q, p, x] in Java is [x]

Аналогично, вычисление объединения двух множеств в Java:

Set<String> union = Sets.union(a, b);
System.out.printf("Union of two Set %s and %s in Java is %s %n",
                a.toString(), b.toString(), union.toString());

Выход: Union of two Set [z, y, x] and [q, p, x] in Java is [q, p, x, z, y]

Подробнее о библиотеке гуавы можно прочитать на https://google.github.io/guava/releases/18.0/api/docs/

Чтобы добавить библиотеку гуавы в свой проект, вы можете посмотреть https://stackoverflow.com/a/4648947/8258942

0 голосов
/ 07 декабря 2018

Хотя guava, конечно, более аккуратный и в значительной степени стандартный, вот неразрушающий способ объединения и пересечения с использованием только стандартной Java

Set s1 = Set.of(1,2,3);
Set s2 = Set.of(3,4,5);     

Set union = Stream.concat(s1.stream(),s2.stream()).toSet(); 
Set intersect = s1.stream().filter(s2::contains).toSet();
0 голосов
/ 30 июня 2018

Самое простое однострочное решение таково:

set1.addAll(set2); // Union
set1.retainAll(set2); // Intersection

Приведенное выше решение является деструктивным , означающим, что содержимое оригинала set1 мое изменение. Если вы не хотите трогать существующие наборы, создайте новый набор:

Set<E> result = new HashSet<>(set1);
 // └─ your specific type
result.addAll(set2); // Union
result.retainAll(set2); // Intersection
...