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ベースのプロジェクトなので、簡単に実行できます。そのままインポートして実行します。