グアバBiMapガイド

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,のキーを処理する場合は、クラスEnumHashBiMapcreateメソッドを使用します。

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回保存しようとすると、BiMapIllegalArgumentExceptionをスローします。

同じ例を見てみましょう。

@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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。