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プロジェクトなので、インポートおよび実行が簡単です。そのまま。