Javaでの操作の設定

1. 前書き

セットは、アイテムの一意のコレクションを表す便利な方法です。
このチュートリアルでは、それが何を意味するのか、そしてそれをJavaでどのように使用できるのかについて詳しく学びます。

2. 集合論のビット

* 2.1。 セットとは*

セットは、単に一意なもののグループです。 したがって、*セットの重要な特徴は、重複が含まれていないことです*。
好きなものをセットに入れることができます。 ただし、通常はセットを使用して、共通の特性を持つものをグループ化します。 たとえば、一連の車両または一連の動物を使用できます。
簡単な例として、2組の整数を使用してみましょう。
setA : {1, 2, 3, 4}

setB : {2, 4, 6, 8}
値を円に入れるだけで、図としてセットを表示できます。+ link:/uploads/SetASetB-2.png []
このような図はベン図と呼ばれ、後で説明するように、セット間の相互作用を示す便利な方法を提供します。

* 2.2。 セットの交差点+

*
  • _intersection_という用語は、異なるセットの共通値*を意味します。

    整数2と4が両方のセットに存在することがわかります。 したがって、setAとsetBの共通部分は2と4です。これらは両方のセットに共通の値だからです。
setA intersection setB = {2, 4}
ダイアグラムに交差点を表示するために、2つのセットをマージし、両方のセットに共通の領域を強調表示します。+ link:/uploads/interesection-1.png []

* 2.3。 セットの連合+

*
  • _union_という用語は、異なるセットの値を結合することを意味します*。

    それでは、サンプルセットの和集合である新しいセットを作成しましょう。 セットに重複した値を含めることはできません。 ただし、セットには重複した値がいくつかあります(2と4)。 したがって、両方のセットのコンテンツを結合するとき、重複を削除する必要があります。 したがって、最終的には1、2、3、4、6、8になります。
setA union setB = {1, 2, 3, 4, 6, 8}
繰り返しますが、結合を図で示すことができます。 2つのセットをマージして、ユニオンを表す領域を強調表示しましょう:+ link:/uploads/union-2.png []

* 2.4。 セットの相対補数+

*
  • _relativelement_という用語は、あるセットから別のセットにない値を意味します*。 これはセットの差とも呼ばれます。

    _setA_と_setB_の相対的な補数である新しいセットを作成しましょう。
relative complement of setA in setB = {6, 8}

relative complement of setB in setA = {1, 3}
それでは、_setB_の一部ではない_setA_の領域を強調表示しましょう。 これにより、_setA_の_setB_の相対補完が得られます。+ link:/uploads/relativecomplement-1.png []

* 2.5。 サブセットとスーパーセット*

サブセットは単純に大きなセットの一部であり、大きなセットはスーパーセットと呼ばれます。 サブセットとスーパーセットがある場合、2つの結合はスーパーセットに等しく、交差はサブセットに等しくなります。

*3. _java.util.Set_を使用した集合演算の実装+

*
Javaで集合演算をどのように実行するかを確認するために、サンプルの集合を使用して、交差、結合、および相対的な補完を実装します。 整数のサンプルセットを作成することから始めましょう。
private Set<Integer> setA = setOf(1,2,3,4);
private Set<Integer> setB = setOf(2,4,6,8);

private static Set<Integer> setOf(Integer... values) {
    return new HashSet<Integer>(Arrays.asList(values));
}

* 3.1。 交差点*

まず、_retainAll_メソッドを使用して、*サンプルセットの共通部分を作成します*。 _retainAll_はセットを直接変更するため、_intersectSet._という_setA_のコピーを作成します。次に、_retainAll_メソッドを使用して、_setB_にもある値を保持します。
Set<Integer> intersectSet = new HashSet<>(setA);
intersectSet.retainAll(setB);
assertEquals(setOf(2,4), intersectSet);

* 3.2。 連合*

_addAll_メソッドを使用して、*サンプルセットの和集合を作成しましょう*。 _addAll_メソッドは、指定されたセットのすべてのメンバーをもう一方に追加します。 再度_addAll_がセットを直接更新するので、_unionSet_と呼ばれる_setA_のコピーを作成し、それに_setB_を追加します。
Set<Integer> unionSet = new HashSet<>(setA);
unionSet.addAll(setB);
assertEquals(setOf(1,2,3,4,6,8), unionSet);

* 3.3。 相対補数*

最後に、_removeAll_メソッドを使用して、* setA_で_setB_の相対補完を作成します*。 _setB_には存在しない_setA_にある値が必要であることを知っています。 したがって、_setB_にある_setA_からすべての要素を削除する必要があります。
Set<Integer> differenceSet = new HashSet<>(setA);
differenceSet.removeAll(setB);
assertEquals(setOf(1,3), differenceSet);

4. Streamsを使用した集合演算の実装

* 4.1。 交差点*

_Streams_を使用して、セットの共通部分を作成しましょう。
最初に、_setA_からストリームに値を取得します。 *その後、_setB_にもあるすべての値を保持するためにストリームをフィルターします。*最後に、結果を新しい_Set_に収集します。
Set<Integer> intersectSet = setA.stream()
    .filter(setB::contains)
    .collect(Collectors.toSet());
assertEquals(setOf(2,4), intersectSet);

* 4.2。 連合*

次に、静的メソッド_Streams.concat_を使用して、セットの値を単一の_stream_に追加します。
*セットの連結からユニオンを取得するには、重複を削除する必要があります。*これを行うには、結果を_Set_に単純に収集します。
Set<Integer> unionSet = Stream.concat(setA.stream(), setB.stream())
    .collect(Collectors.toSet());
assertEquals(setOf(1,2,3,4,6,8), unionSet);

* 4.3。 相対補数*

最後に、_setA_に_setB_の相対的な補数を作成します。
交差の例で行ったように、最初に_setA_から値をストリームに取得します。 今回は、_setB_にもある値を削除するためにストリームをフィルターします。 次に、結果を新しい_Set_に収集します。
Set<Integer> differenceSet = setA.stream()
    .filter(val -> !setB.contains(val))
    .collect(Collectors.toSet());
assertEquals(setOf(1,3), differenceSet);

5. セット操作用のユーティリティライブラリ

Pure Javaで基本的な集合演算を実行する方法を見てきました。*いくつかのユーティリティライブラリを使用して同じ演算を実行しましょう。*これらのライブラリを使用する利点の1つは、メソッド名がどの演算が行われているかを明確に示していることです実行されました。

* 5.1。 依存関係*

https://search.maven.org/search?q=g:com.google.guava%20AND%20a:guava[Guava _Sets_]およびhttps://search.maven.org/search?qを使用するには= g:org.apache.commons%20AND%20a:commons-collections4 [Apache Commons Collections _SetUtils_]依存関係を追加する必要があります。
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.1-jre</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.3</version>
</dependency>

* 5.2。 グアバセット*

Guava _Sets_クラスを使用して、サンプルセットで_intersection_および_union_を実行しましょう。 これを行うには、_Sets_クラスの静的メソッド_union_および_intersection_を使用するだけです。
Set<Integer> intersectSet = Sets.intersection(setA, setB);
assertEquals(setOf(2,4), intersectSet);

Set<Integer> unionSet = Sets.union(setA, setB);
assertEquals(setOf(1,2,3,4,6,8), unionSet);
詳細については、https://www.baeldung.com/guava-sets [グアバセットの記事]をご覧ください。

* 5.3。 Apache Commonsコレクション*

次に、Apache Commons Collectionsの_SetUtils_クラスの_intersection_および_union_静的メソッドを使用してみましょう。
Set<Integer> intersectSet = SetUtils.intersection(setA, setB);
assertEquals(setOf(2,4), intersectSet);

Set<Integer> unionSet = SetUtils.union(setA, setB);
assertEquals(setOf(1,2,3,4,6,8), unionSet);
詳細については、https://www.baeldung.com/apache-commons-setutils [Apache Commons Collections _SetUtils_ tutorial]をご覧ください。

6. 結論

セットでいくつかの基本的な操作を実行する方法の概要、およびこれらの操作をさまざまな方法で実装する方法の詳細を見てきました。
すべてのコード例はhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-collections-set[GitHubで]にあります。