グアバ-セット
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"));
}
注意–結果を簡単にテストできるように、FunctionとJoinerを使用して、複雑な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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。