1. 概要

このチュートリアルでは、GoogleGuavaのBiMapインターフェースとその複数の実装の使用方法を示します。

BiMap (または「双方向マップ」)は、重複する値が存在せず、値を常に安全に使用してキーを取得できるようにしながら、マップの逆ビューを維持する特殊な種類のマップです。戻る。

BiMapの基本的な実装はHashBiMapで、内部で2つの Map を使用します。1つはキーから値へのマッピング用で、もう1つは値からキーへのマッピング用です。マッピング。

2. GoogleGuavaのBiMap

BiMapクラスの使い方を見てみましょう。

pom.xmlにGoogleGuavaライブラリの依存関係を追加することから始めます。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

依存関係の最新バージョンはここで確認できます。

3. BiMapの作成

BiMap のインスタンスは、次のように複数の方法で作成できます。

  • カスタムJavaオブジェクトを処理する場合は、クラスHashBiMapのcreateメソッドを使用します。
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
  • 既存のマップがすでにある場合は、クラスHashBiMapからのcreateメソッドのオーバーロードバージョンを使用して、BiMapのインスタンスを作成できます。
Map<String, String> capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
  • タイプEnumのキーを処理する場合は、クラスEnumHashBiMapcreateメソッドを使用します。
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の各値を関連するキーにマップします。

BiMap は、重複する値を2回格納しようとすると、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を使用する例を示しました。 これは主に、マップからの値に基づいてキーを取得するために使用されます。

これらの例の実装は、 GitHubプロジェクトにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。