web-dev-qa-db-ja.com

Java Setsの和集合と交差点

JavaでSetsの結合または交差を作成する最も簡単な方法は何ですか?この単純な問題に対するいくつかの奇妙な解決策を見てきました(たとえば、2つのセットを手動で繰り返す)。

enter image description hereenter image description here

5
Mahozad

最も簡単な1行のソリューションは次のとおりです。

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
12
Mahozad

グアバは確かにすてきで標準的ですが、ここでは標準の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();
8

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の2つのセットの交差点を計算します。

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での2つのセットの和集合の計算:

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]

Guavaライブラリの詳細については、 https://google.github.io/guava/releases/18.0/api/docs/ をご覧ください。

プロジェクトにグアバライブラリを追加するために、 https://stackoverflow.com/a/4648947/8258942 を見ることができます

3
Nitin Bisht