グアバ - セット

グアバ-セット

1. 概要

このチュートリアルでは、leverage Guava to work with Java Setsを実行できる最も便利な方法を説明します。

Guavaを使用して、新しい演算子なしで非常に単純なcreate a HashSetを開始しましょう。

Set aNewSet = Sets.newHashSet();

2. セットの連合

まず、単純なSets.union() APIを使用してdo a union operation over Setsを実行する方法を見てみましょう。

@Test
public void whenCalculatingUnionOfSets_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b', 'c');
    Set second = ImmutableSet.of('b', 'c', 'd');

    Set union = Sets.union(first, second);
    assertThat(union, containsInAnyOrder('a', 'b', 'c', 'd'));
}

3. セットのデカルト積

次の例のように、Sets.cartesianProduct()を使用してthe product of two setsを取得することもできます。

@Test
public void whenCalculatingCartesianProductOfSets_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b');
    Set second = ImmutableSet.of('c', 'd');
    Set> result =
      Sets.cartesianProduct(ImmutableList.of(first, second));

    Function, String> func =
      new Function, String>() {
        public String apply(List input) {
            return Joiner.on(" ").join(input);
        }
    };
    Iterable joined = Iterables.transform(result, func);
    assertThat(joined, containsInAnyOrder("a c", "a d", "b c", "b d"));
}

注意–結果を簡単にテストできるように、FunctionJoinerを使用して、複雑なSet<List<Character>>構造をより管理しやすいIterable<String>に変換しています。

4. Sets交差

次へ–Sets.intersection() APIを使用してthe intersection between two setsを取得する方法を見てみましょう:

@Test
public void whenCalculatingSetIntersection_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b', 'c');
    Set second = ImmutableSet.of('b', 'c', 'd');

    Set intersection = Sets.intersection(first, second);
    assertThat(intersection, containsInAnyOrder('b', 'c'));
}

5. セットの対称差

次に、2つのセットの対称差を見てみましょう。セット1またはセット2のいずれかに含まれているが、両方には含まれていないすべての要素です。

@Test
public void whenCalculatingSetSymmetricDifference_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b', 'c');
    Set second = ImmutableSet.of('b', 'c', 'd');

    Set intersection = Sets.symmetricDifference(first, second);
    assertThat(intersection, containsInAnyOrder('a', 'd'));
}

6. パワーセット

次に、そのセットのthe power set – the set of all possible subsetsを計算する方法を見てみましょう。

次の例では、Sets.powerSet()を使用して、指定された文字セットのべき集合を計算します。

@Test
public void whenCalculatingPowerSet_thenCorrect() {
    Set chars = ImmutableSet.of('a', 'b');

    Set> result = Sets.powerSet(chars);

    Set empty =  ImmutableSet. builder().build();
    Set a = ImmutableSet.of('a');
    Set b = ImmutableSet.of('b');
    Set aB = ImmutableSet.of('a', 'b');

    assertThat(result, contains(empty, a, b, aB));
}

7. ContiguousSet

次へ–並べ替えられた連続する値のセット–ContiguousSetを見てみましょう。

次の例では、整数のセット[10、11、…、30]をContiguousSetに取得します。

@Test
public void whenCreatingRangeOfIntegersSet_thenCreated() {
    int start = 10;
    int end = 30;
    ContiguousSet set = ContiguousSet.create(
      Range.closed(start, end), DiscreteDomain.integers());

    assertEquals(21, set.size());
    assertEquals(10, set.first().intValue());
    assertEquals(30, set.last().intValue());
}

もちろん、このタイプのデータ構造は、TreeSetを使用してプレーンJavaで実行できるものですが、データをこのように表現する必要がある場合は、the semantics of this specialized type of set are just much more nicerを使用できます。

8. RangeSet

では、RangeSetを見てみましょう。 RangeSetを使用して、切断された空でない範囲を保持できます。

次の例では、2つの切断された範囲から開始し、それらを単一の大きな範囲に接続します。

@Test
public void whenUsingRangeSet_thenCorrect() {
    RangeSet rangeSet = TreeRangeSet.create();
    rangeSet.add(Range.closed(1, 10));
    rangeSet.add(Range.closed(12, 15));

    assertEquals(2, rangeSet.asRanges().size());

    rangeSet.add(Range.closed(10, 12));
    assertTrue(rangeSet.encloses(Range.closed(1, 15)));
    assertEquals(1, rangeSet.asRanges().size());
}

この例を詳しく見ていきましょう:**

  • 最初に– 2つの切断された範囲を挿入します:[1, 10][12, 15]

  • 次へ–既存の2を接続するための3番目の範囲を追加します:[10, 12]

  • 最後に、RangeSetが十分にスマートであり、3つの範囲が1つの大きな範囲になったことを確認し、それらを次のようにマージします。[1, 15]

9. MultiSet

次へ–Multisetの使用方法について説明しましょう。 通常のセットとは対照的に、a Multiset does support adding duplicate elements – which it counts as occurrences

次の例では、いくつかの単純なマルチセットロジックを実行します。

@Test
public void whenInsertDuplicatesInMultiSet_thenInserted() {
    Multiset names = HashMultiset.create();
    names.add("John");
    names.add("Adam", 3);
    names.add("John");

    assertEquals(2, names.count("John"));
    names.remove("John");
    assertEquals(1, names.count("John"));

    assertEquals(3, names.count("Adam"));
    names.remove("Adam", 2);
    assertEquals(1, names.count("Adam"));
}

10. MultiSetで上位N個の要素を取得

では、MultiSetを使用するより複雑で便利な例を見てみましょう。 セット内の上位N個の要素(基本的に最も一般的な要素)を取得します。

次の例では、Multisets.copyHighCountFirst()を使用してMultisetの要素を並べ替えます。

@Test
public void whenGetTopOcurringElementsWithMultiSet_thenCorrect() {
    Multiset names = HashMultiset.create();
    names.add("John");
    names.add("Adam", 5);
    names.add("Jane");
    names.add("Tom", 2);

    Set sorted = Multisets.copyHighestCountFirst(names).elementSet();
    List sortedAsList = Lists.newArrayList(sorted);
    assertEquals("Adam", sortedAsList.get(0));
    assertEquals("Tom", sortedAsList.get(1));
}

11. 結論

このクイックチュートリアルでは、working with Sets using the Guava libraryの最も一般的で便利なユースケースについて説明しました。

これらすべての例とコードスニペットcan be found in my Guava github projectの実装–これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。