グアバマルチマップガイド
1. 概要
この記事では、GoogleGuavaライブラリのMap実装の1つであるMultimapについて説明します。 これは、 java.util.Map と同様に、キーを値にマップするコレクションですが、各キーは複数の値に関連付けられている場合があります。
2. Mavenの依存関係
まず、依存関係を追加しましょう。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
最新バージョンはここにあります。
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」で値を取得すると、次のようになります。 コレクション
Collection<String> values = map.get(key);
値を出力すると、次のように出力されます。
[firstValue, secondValue]
4. 標準のマップとの比較
java .util パッケージの標準マップでは、同じキーに複数の値を割り当てることはできません。 同じキーを使用してput()2つの値をマップに入れる単純なケースを考えてみましょう。
String key = "a-key";
Map<String, String> map = new LinkedHashMap<>();
map.put(key, "firstValue");
map.put(key, "secondValue");
assertEquals(1, map.size());
結果のmapには、最初の値をオーバーライドする2番目の put()操作のため、1つの要素( “secondValue”)、しかありません。 Guavaと同じ動作を実現したい場合マルチマップ 、 を作成する必要があります地図それはリスト
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。よりも優れた選択肢になる可能性があります。
ここで注意すべきことの1つは、2つの要素を含むリストがありますが、 size()メソッドは1を返すことです。 Multimapでは、size()は Map、に格納されている実際の値の数を返しますが、 keySet()。size()は個別のキーの数を返します。
5. マルチマップの長所
マルチマップは、一般的に、 地図
- put()を使用してエントリを追加する前に、空のコレクションにデータを入力する必要はありません。
- get()メソッド二度と戻らないヌル 、空のコレクションのみ(チェックする必要はありません) ヌルのように地図
>> テストケース) - キーは、少なくとも1つの値にマップされる場合にのみ、Multimapに含まれます。 キーに関連付けられた値がゼロになる操作は、そのキーをから削除する効果があります。 マルチマップ (の地図
>、 コレクションからすべての値を削除しても、空のままですコレクション値として、これは不要なメモリオーバーヘッドです) - エントリ値の合計数は、 size()として利用できます。
6. 結論
この記事では、GuavaMultimapをいつどのように使用するかを示します。標準のjava.util.Mapと比較し、GuavaMultimap。の長所を示します。
これらの例とコードスニペットはすべて、 GitHubプロジェクトにあります。これはMavenプロジェクトであるため、そのままインポートして実行するのは簡単です。