webentwicklung-frage-antwort-db.com.de

Symmetrischer Unterschied zweier Sätze in Java

In meiner App gibt es zwei TreeSets:

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

Ich möchte die symmetrische Differenz dieser Mengen erhalten, damit meine Ausgabe die Menge wäre:

set = {501,505}
27
Abhij

Du bist hinter dem symmetrischen Unterschied . Dies wird im Java-Tutorial erläutert.

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
23
Donal Fellows

Sie könnten CollectionUtils#disjunction verwenden.

BEARBEITEN:

Alternativ mit weniger Java-Vorkenntnissen verwenden Sie Guava Sets # symmetricDifference

11
beny23

Wer/die nach Subtraktion/Komplement (nicht symmetrische Differenz/Disjunktion) suchen, kann CollectionUtils.subtract(a,b) oder Sets.difference(a,b) verwenden.

3
jameshfisher

verwenden Sie "Alle beibehalten" und "Alle entfernen". Fügen Sie dann "Alle hinzufügen" hinzu, um eine Verknüpfung der vorhandenen Gruppe herzustellen.

  1. intersectionSet.retainAll (set2) // intersectionSet ist eine Kopie von set1
  2. set1.addAll (set2); // mache eine Vereinigung von set1 und set2
  3. dann entfernen Sie die Duplikate set1.removeAll (intersectionSet);
1
digitebs
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);

ausgabe von S1: [a, c]

0
Chandra Sekhar

wenn wir das Paket com.google.common.collect verwenden, können wir möglicherweise einen symmetrischen Unterschied wie diesen finden:

    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 ));

Die Ausgabe wird sein: [1, 5]

0
dobrivoje

Sie könnten Sets.symmetricDifference() von Eclipse Collections versuchen.

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);

Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.

0
Donald Raab