グアバマルチマップガイド

1概要

この記事では、Google Guavaライブラリの Map 実装の1つである Multimap について説明します。 java.util.Map と同様に、キーを値にマッピングするコレクションです。ただし、各キーは複数の値に関連付けることができます。

2 Mavenの依存関係

まず、依存関係を追加しましょう。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>21.0</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%22guava%22[here]にあります。

3. __マルチマップの実装

Guava Multimapの場合、同じキーに2つの値を追加しても、2番目の値は最初の値を上書きしません。代わりに、結果の map__に2つの値があります。テストケースを見てみましょう。

String key = "a-key";
Multimap<String, String> map = ArrayListMultimap.create();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(2, map.size());

map のコンテンツを印刷すると、次のように出力されます。

{a-key=[firstValue, secondValue]}

キー "a-key"で値を取得すると、結果として "firstValue"と "secondValue"を含む Collection <String> が取得されます。

Collection<String> values = map.get(key);

印刷値は次のように出力されます。

----[firstValue, secondValue]----

4標準との比較 Map

java.util パッケージの標準マップでは、同じキーに複数の値を割り当てることはできません。同じキーを使用して2つの値を Map put() する単純な場合を考えてみましょう。

String key = "a-key";
Map<String, String> map = new LinkedHashMap<>();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(1, map.size());

最初の値をオーバーライドする2番目の put() 操作のため、結果の map には1つの要素( "secondValue")しかありません。 Guavaの Multimapと同じ動作を実現したい場合は、 List <String> を値の型として持つ Map を作成する必要があります。

String key = "a-key";
Map<String, List<String>> map = new LinkedHashMap<>();

List<String> values = map.get(key);
if(values == null) {
    values = new LinkedList<>();
    values.add("firstValue");
    values.add("secondValue");
 }

map.put(key, values);

assertEquals(1, map.size());

明らかに、使用するのはあまり便利ではありません。私たちのコードにそのような必要性があるならば、Guavaの Multimap java.util.Map. よりも良い選択かもしれません

ここで注意しなければならないことは、2つの要素を持つリストがあるにもかかわらず、 size() メソッドが1を返すことです。 ).size()__は、異なるキーの数を返します。

5 Multimap の長所

マルチマップは、 Map <K、Collection <V>> が別の方法で表示される場所で一般的に使用されます。違いは次のとおりです。

  • 追加する前に空のコレクションを作成する必要はありません。

put() を使ったエントリ ** get()method null を返しません。空のコレクションのみ

Map <String、Collection <V>> のように null と照合する必要はありません。 テストケース) ** キーが Multimap に含まれるのは、そのキーがatにマップされている場合だけです。

少なくとも1つの値キーにゼロが関連付けられるようにする操作 valuesは、 Multimap からそのキーを削除する効果があります。 Map <String、Collection <V>>、 からすべての値を削除しても コレクションとして、空の Collection を値として保持します。これは 不要なメモリオーバーヘッド) ** 合計エントリー値カウントは size()__として利用可能です

6. 結論

この記事では、Guava Multimap. の使用方法と使用方法を示します。これは、標準の java.util.Map と比較し、Guava Multimap. の長所を示しています。

これらの例とコードスニペットはすべてhttps://github.com/eugenp/tutorials/tree/master/guava-collections[GitHubプロジェクト]にあります。これはMavenプロジェクトなので、インポートおよび実行が簡単です。そのまま。