Guava BiMapのガイド
1. 概要
このチュートリアルでは、Google GuavaのBiMapインターフェースとその複数の実装を使用する方法を示します。
BiMap(または「双方向マップ」)は、重複する値が存在せず、値を常に安全に使用してキーを取り戻すことができるようにしながら、マップの逆ビューを維持する特殊な種類のマップです。
BiMapの基本的な実装はHashBiMapであり、内部では2つのMapsを使用します。1つはキーから値へのマッピング用で、もう1つは値からキーへのマッピング用です。
2. Google GuavaのBiMap
BiMapクラスの使用方法を見てみましょう。
まず、pom.xmlにGoogleGuavaライブラリの依存関係を追加します。
com.google.guava
guava
21.0
依存関係の最新バージョンはhereで確認できます。
3. BiMapの作成
次のように、複数の方法でBiMapのインスタンスを作成できます。
-
カスタムJavaオブジェクトを処理する場合は、クラスHashBiMapのcreateメソッドを使用します。
BiMap capitalCountryBiMap = HashBiMap.create();
-
既存のマップがすでにある場合は、クラスHashBiMapからのcreateメソッドのオーバーロードバージョンを使用して、BiMapのインスタンスを作成できます。
Map capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
-
タイプEnum,のキーを処理する場合は、クラスEnumHashBiMapのcreateメソッドを使用します。
BiMap operationStringBiMap = EnumHashBiMap.create(MyEnum.class);
-
不変のマップを作成する場合は、ImmutableBiMapクラス(ビルダーパターンに従う)を使用します。
BiMap capitalCountryBiMap
= new ImmutableBiMap.Builder<>()
.put("New Delhi", "India")
.build();
4. BiMapの使用
BiMap,の使用法を示す簡単な例から始めましょう。ここでは、値に基づいてキーを取得し、キーに基づいて値を取得できます。
@Test
public void givenBiMap_whenQueryByValue_shouldReturnKey() {
BiMap 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 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 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を使用する例を示しました。 主に、マップの値に基づいてキーを取得するために使用されます。
これらの例の実装はthe GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。