1概要

この記事では、Apache Commons Collectionsライブラリーの

SetUtils

APIを検討します。簡単に言うと、これらのユーティリティは、Javaの

Set

データ構造に対して特定の操作を実行するために使用できます。


2依存関係のインストール

プロジェクトで

SetUtils

ライブラリを使用するには、プロジェクトの

pom.xml

ファイルに次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

または、プロジェクトがGradleベースの場合は、プロジェクトの

build.gradle

ファイルに依存関係を追加する必要があります。また、

build.gradle

ファイルのrepositoriesセクションに

mavenCentral()

を追加する必要があります。

compile 'org.apache.commons:commons-collections4:4.1'


3述語セット


SetUtils

ライブラリの

predicatedSet()メソッドは、セットに挿入されるすべての要素が満たすべき条件を定義することを許可します。ソースの

Set__オブジェクトと述語を受け入れます。

これを使用して

Set

のすべての要素が特定の条件を満たすことを簡単に検証できます。これはサードパーティのライブラリ/APIを開発するときに便利です。

検証がいずれかの要素に対して失敗した場合、

IllegalArgumentException

がスローされます。以下のスニペットは、

Lで始まらない

** 文字列が

sourceSet

または返された

validatingSet

に追加されるのを防ぎます。

Set<String> validatingSet
  = SetUtils.predicatedSet(sourceSet, s -> s.startsWith("L"));

このライブラリには、

SortedSet



NavigableSet

を操作するための

predicatedSortedSet()



predicatedNavigableSet()

もあります。


4集合の和、差、および交点

ライブラリには、和、差、および

Set

要素の共通部分を計算できるメソッドがあります。


difference()

メソッドは2つの

Set

オブジェクトを受け取り、不変の

SetUtils.SetView

オブジェクトを返します。返される

SetUtils.SetView

には、セット

a

には含まれているがセット

b

には含まれていない要素が含まれています。

Set<Integer> a = new HashSet<>(Arrays.asList(1, 2, 5));
Set<Integer> b = new HashSet<>(Arrays.asList(1, 2));
SetUtils.SetView<Integer> result = SetUtils.difference(a, b);

assertTrue(result.size() == 1 && result.contains(5));

  • 返された

    SetUtils.SetView

    に対して

    add()



    addAll()

    などの書き込み操作を実行しようとすると、

    UnsupportedOperationException

    がスローされます。

返された結果を変更するには、返された

SetUtils.SetView



toSet()

メソッドを呼び出して書き込み可能な

Set

オブジェクトを取得する必要があります。

Set<Integer> mutableSet = result.toSet();


SetUtils

ライブラリの

union

メソッドは正確には実行されますが、set

a



b

のすべての要素が返されます。

union

メソッドは、不変の

SetUtil.SetView

オブジェクトも返します。

Set<Integer> expected = new HashSet<>(Arrays.asList(1, 2, 5));
SetUtils.SetView<Integer> union = SetUtils.union(a, b);

assertTrue(SetUtils.isEqualSet(expected, union));

  • assert文で使用されている

    isEqualSet()

    メソッドに注意してください。

これは

SetUtils

ライブラリの便利な静的メソッドで、2つのセットが等しいかどうかを効果的にチェックします。

集合、つまりset

a

とset

b

の両方に存在する要素の共通部分を取得するには、

SetUtils.intersection()

メソッドを使用します。

このメソッドは

SetUtil.SetView

オブジェクトも返します。

Set<Integer> expected = new HashSet<>(Arrays.asList(1, 2));
SetUtils.SetView<Integer> intersect = SetUtils.intersection(a, b);

assertTrue(SetUtils.isEqualSet(expected, intersect));


5集合要素の変換

別のおもしろいメソッド、

SetUtils.transformedSet()

を見てみましょう。このメソッドは

Set

オブジェクトと

Transformer

インターフェースを受け取ります。ソースセットに支えられて、それはセットのすべての要素を変換するために

Transformer

インターフェースの

transform()

メソッドを使います。

変換ロジックは、

Transformer

インターフェースの

transform()

メソッドで定義され、セットに追加されたすべての要素に適用されます。以下のコードスニペットは、セットに追加されたすべての要素を2倍します。

Set<Integer> a = SetUtils.transformedSet(new HashSet<>(), e -> e **  2  );
a.add(2);

assertEquals(a.toArray()[0], 4);


transformedSet()

メソッドはかなり便利です – それらは集合の要素をキャストするのにさえ使うことができます – 例えばStringからIntegerへ。出力の型が入力のサブタイプであることを確認してください。


HashSetの代わりに

SortedSet

または

NavigableSet

を使用しているとします。


transformedSortedSet()

または

transformedNavigableSet()

をそれぞれ使用できます。

新しい

HashSet

インスタンスが

transformedSet()

メソッドに渡されることに注意してください。既存の空でない

Set

がメソッドに渡される状況では、既存の要素は変換されません。

既存の要素(およびその後に追加された要素)を変換する場合は、

org.apache.commons.collections4.set.TransformedSet



transformedSet()

メソッドを使用する必要があります。

Set<Integer> source = new HashSet<>(Arrays.asList(1));
Set<Integer> newSet = TransformedSet.transformedSet(source, e -> e **  2);

assertEquals(newSet.toArray()[0], 2);
assertEquals(source.toArray()[0], 2);

ソースセットの要素が変換され、結果が返された

newSet.

にコピーされることに注意してください。

6.選言集合


SetUtils

ライブラリは、集合選言を見つけるために使用できる静的メソッドを提供します。集合

a

と集合

b

の選言は、集合aと集合bに固有のすべての要素です。


SetUtils

ライブラリの

disjunction()

メソッドの使い方を見てみましょう。

Set<Integer> a = new HashSet<>(Arrays.asList(1, 2, 5));
Set<Integer> b = new HashSet<>(Arrays.asList(1, 2, 3));
SetUtils.SetView<Integer> result = SetUtils.disjunction(a, b);

assertTrue(
  result.toSet().contains(5) && result.toSet().contains(3));


7.

SetUtils

ライブラリ

の他のメソッド


SetUtils

ライブラリには、セットデータの処理を簡単にする他のメソッドがあります。


  • synchronizedSet()

    または

    synchronizedSortedSet()

    を使用して

スレッドセーフ

Set

ただし、ドキュメントに記載されているように、

手動で
決定論的でないことを避けるために、返されたセットのイテレータを同期させる

動作
** 読み取り専用のセットを取得するために

SetUtils.unmodifiableSet()

を使用できます。

返された

Set

Objectに要素を追加しようとすると、

UnsupportedOperationException

をスローします。
** を返す

SetUtils.emptySet()

メソッドもあります。

型保証、不変の空集合
**

SetUtils.emptyIfNull()

メソッドは、NULL可能な

Set

オブジェクトを受け入れます。

指定された

Set

がnullの場合、空の読み取り専用のS

__et


を返します。
それ以外の場合は、指定された

Set

を返します。
**

SetUtils.orderedSet()

は、を保持する

Set__オブジェクトを返します。

要素が追加された順序
**

SetUtils.hashCodeForSet()

はセットのハッシュコードを生成できます

同じ要素の2つのセットが同じになるように
ハッシュコード
**

SetUtils.newIdentityHashSet()

は、

==

を使用する

HashSet

を返します。


equals()

メソッドの代わりに要素を照合します。その注意事項についてお読みくださいhttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/SetUtils.html#newIdentityHashSet–[こちら]

8.まとめ

この記事では、私たちは

SetUtils

ライブラリーの重要性を探りました。このユーティリティクラスは、セットデータ構造を扱うのを簡単でエキサイティングにする静的メソッドを提供します。生産性も向上します。

いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[over on GitHub]から入手できます。

SetUtils

APIの公式ドキュメントは、https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/SetUtils.html[こちら]にあります。




  • «** 前へ