グアバBiMapガイド
1概要
このチュートリアルでは、Google Guavaの
BiMap
インターフェイスとその複数の実装の使用方法について説明します。
BiMap
(または「双方向マップ」)は、重複する値が存在せず、キーを取り戻すために値を常に安全に使用できるようにしながら、マップの逆方向のビューを維持する特別な種類のマップです。
BiMap
の基本的な実装は
HashBiMap
です。内部では2つの
__Map
__を使用します。1つは値から値へのマッピング、もう1つは値からキーへのマッピングです。
2 Google Guavaの
BiMap
BiMap
クラスの使い方を見てみましょう。
まず、
pom.xml
にGoogle Guavaライブラリの依存関係を追加します。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%22guava%22[]で確認できます。ここに]。
** 3 BiMapを作成する
**
次のように、
BiMap
のインスタンスを複数の方法で作成できます。
-
カスタムJavaオブジェクトを扱う場合は、
create
を使用してください。
クラスHashBiMapからのメソッド:
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
-
既に既存の地図がある場合は、
クラス
HashBiMap
からオーバーロードされたバージョンの
create
メソッドを使用して
BiMap
:
Map<String, String> capitalCountryBiMap = new HashMap<>();//...
HashBiMap.create(capitalCountryBiMap);
-
Enum型のキーを扱う場合は、
create__を使用してください。
クラス
EnumHashBiMap
のメソッド:
BiMap<MyEnum, String> operationStringBiMap = EnumHashBiMap.create(MyEnum.class);
-
不変マップを作成したい場合は、
ImmutableBiMap
を使用
クラス(これはビルダーパターンに従います):
BiMap<String, String> capitalCountryBiMap
= new ImmutableBiMap.Builder<>()
.put("New Delhi", "India")
.build();
** 4 BiMap +を使う
**
__BiMapの使い方を示す簡単な例から始めましょう。ここでは、値に基づいてキーを取得し、キーに基づいて値を取得します。
@Test
public void givenBiMap__whenQueryByValue__shouldReturnKey() {
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
capitalCountryBiMap.put("New Delhi", "India");
capitalCountryBiMap.put("Washington, D.C.", "USA");
capitalCountryBiMap.put("Moscow", "Russia");
String keyFromBiMap = capitalCountryBiMap.inverse().get("Russia");
String valueFromBiMap = capitalCountryBiMap.get("Washington, D.C.");
assertEquals("Moscow", keyFromBiMap);
assertEquals("USA", valueFromBiMap);
}
注:上記の
inverse
メソッドは、BiMapの各値を関連するキーにマッピングする
BiMap
の逆ビューを返します。
重複した値を2回格納しようとすると、
BiMap
は
IllegalArgumentException
をスローします。
同じ例を見てみましょう。
@Test(expected = IllegalArgumentException.class)
public void givenBiMap__whenSameValueIsPresent__shouldThrowException() {
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
capitalCountryBiMap.put("Mumbai", "India");
capitalCountryBiMap.put("Washington, D.C.", "USA");
capitalCountryBiMap.put("Moscow", "Russia");
capitalCountryBiMap.put("New Delhi", "India");
}
BiMap
に既に存在する値を上書きしたい場合は、
forcePut
メソッドを使用できます。
@Test
public void givenSameValueIsPresent__whenForcePut__completesSuccessfully() {
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
capitalCountryBiMap.put("Mumbai", "India");
capitalCountryBiMap.put("Washington, D.C.", "USA");
capitalCountryBiMap.put("Moscow", "Russia");
capitalCountryBiMap.forcePut("New Delhi", "India");
assertEquals("USA", capitalCountryBiMap.get("Washington, D.C."));
assertEquals("Washington, D.C.", capitalCountryBiMap.inverse().get("USA"));
}
5結論
この簡潔なチュートリアルでは、Guavaライブラリの
BiMap
の使用例を示しました。主にマップからの値に基づいてキーを取得するために使用されます。
これらの例の実装はhttps://github.com/eugenp/tutorials/tree/master/java-collections-maps[GitHubプロジェクト]にあります – これはMavenベースのプロジェクトなので、簡単に実行できます。そのままインポートして実行します。