Симметричная разность двух множеств в Java - PullRequest
28 голосов
/ 14 марта 2012

В моем приложении есть два TreeSet с:

set1 = {501,502,503,504}
set2 = {502,503,504,505}

Я хочу получить симметричную разницу этих наборов, чтобы мой вывод был таким:

set = {501,505}

Ответы [ 7 ]

24 голосов
/ 14 марта 2012

Вы после симметричной разности .Это обсуждается в руководстве по Java .

Set<Type> symmetricDiff = new HashSet<Type>(set1);
symmetricDiff.addAll(set2);
// symmetricDiff now contains the union
Set<Type> tmp = new HashSet<Type>(set1);
tmp.retainAll(set2);
// tmp now contains the intersection
symmetricDiff.removeAll(tmp);
// union minus intersection equals symmetric-difference
11 голосов
/ 14 марта 2012

Вы можете использовать CollectionUtils#disjunction

РЕДАКТИРОВАТЬ:

В качестве альтернативы с меньшим количеством pre-Java-5-ness, используйте Guava Sets #mmetricDifference

3 голосов
/ 20 августа 2015

Те, кто ищет установить вычитание / дополнение (не симметричная разность / дизъюнкция), могут использовать CollectionUtils.subtract(a,b) или Sets.difference(a,b).

1 голос
/ 14 марта 2012

используйте retain all, удалите all, затем addAll, чтобы объединить существующий набор.

  1. intersectionSet.retainAll (set2) // intersectionSet является копией set1
  2. set1.addAll (SET2); // сделать объединение set1 и set2
  3. затем удалите дубликаты set1.removeAll (intersectionSet);
0 голосов
/ 24 мая 2019

если мы используем пакет com.google.common.collect, мы можем элегантно найти симметричную разницу, например:

    Set<Integer> s1 = Stream.of( 1,2,3,4,5 ).collect( Collectors.toSet());
    Set<Integer> s2 = Stream.of( 2,3,4 ).collect( Collectors.toSet());
    System.err.println(Sets.symmetricDifference( s1,s2 ));

Вывод будет: [1, 5]

0 голосов
/ 28 апреля 2018

Вы можете попробовать Sets.symmetricDifference() из Коллекции Затмения .

Set<Integer> set1 = new TreeSet<>(Arrays.asList(501,502,503,504));
Set<Integer> set2 = new TreeSet<>(Arrays.asList(502,503,504,505));
Set<Integer> symmetricDifference =
        Sets.symmetricDifference(set1, set2);

Assert.assertEquals(
        new TreeSet<>(Arrays.asList(501, 505)),
        symmetricDifference);

Примечание: я являюсь коммиттером для Eclipse Collections.

0 голосов
/ 14 марта 2012
Set<String> s1 = new HashSet<String>();
    Set<String> s2 = new HashSet<String>();
    s1.add("a");
    s1.add("b");
    s2.add("b");
    s2.add("c");
    Set<String> s3 = new HashSet<String>(s1);
    s1.removeAll(s2);
    s2.removeAll(s3);
    s1.addAll(s2);
    System.out.println(s1);

вывод s1: [a, c]

...