web-dev-qa-db-ja.com

Javaの双方向マップ?

Javaには単純な整数から文字列へのマッピングがありますが、文字列を整数から、また整数を文字列から簡単に取得できる必要があります。 Mapを試しましたが、整数から文字列のみを取得できます。これは1つの方法です。

private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
// This works one way:
String myString = myMap.get(myInteger);

// I would need something like:
Integer myInteger = myMap.getKey(myString);

それを双方向にするための正しい方法はありますか?

もう1つの問題は、変更しない定数値がいくつかしかありません(1->"low", 2->"mid", 3->"high"です。そのため、複雑なソリューションを採用する価値はありません。

74
Danijel

そのためにGoogle Collections APIを使用できます。最近変更された Guava 、具体的には BiMap

バイマップ(または「双方向マップ」)は、その値とキーの一意性を保持するマップです。この制約により、bimapは「逆ビュー」をサポートできます。これは、このbimapと同じエントリを含むが、キーと値が逆になっている別のbimapです。

73
epoch

Guava BiMapを作成し、逆の値を取得するのはそれほど簡単ではありません。

簡単な例:

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

public class BiMapTest {

  public static void main(String[] args) {

    BiMap<String, String> biMap = HashBiMap.create();

    biMap.put("k1", "v1");
    biMap.put("k2", "v2");

    System.out.println("k1 = " + biMap.get("k1"));
    System.out.println("v2 = " + biMap.inverse().get("v2"));
  }
}
32

Java標準APIには双方向マップはありません。 2つのマップを自分で管理するか、Apacheコレクションの BidiMap を使用できます。

21
Mathias Schwarz

Apache commonsコレクションには BidiMap があります

10
hage

キーと値のペアとその逆の両方をマップ構造に挿入できますが、整数を文字列に変換する必要があります。

map.put("theKey", "theValue");
map.put("theValue", "theKey");

Map.get( "theValue")を使用すると、「theKey」が返されます。

これは、一定のマップを作成するための迅速で汚い方法です。これは、いくつかのデータセットのみで機能します。

  • 1対1のペアのみが含まれます
  • 値のセットはキーのセットとは素です(1-> 2、2-> 3が中断します)

<Integer, String>を保持する場合は、2番目の<String, Integer>マップを保持して、値を入力->キーペアにすることができます。

10
Chicowitz

Googleの BiMap を使用

もっと便利です。

4
BOSS