グアバマルチマップガイド
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プロジェクトなので、インポートおよび実行が簡単です。そのまま。