103

私は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"ため、複雑な解決策を検討する価値がないことです。

4

6 に答える 6

92

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

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

于 2012-05-22T09:44:40.333 に答える
48

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"));
  }
}
于 2013-03-21T07:15:48.973 に答える
28

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

于 2012-05-22T09:45:23.220 に答える
14

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

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

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

一定のマップを作成したのは、手早く汚い方法で、選択した少数のデータセットでのみ機能します。

  • 1 対 1 のペアのみを含む
  • 値のセットがキーのセットから切り離されています (1->2、2->3 はそれを壊します)

保持したい場合は、値を「配置」<Integer, String>するための2番目のマップを維持でき<String, Integer>ます->キーペア。

于 2013-11-19T17:12:42.760 に答える
11

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

于 2012-05-22T09:45:50.333 に答える
5

Google のBiMapを使用する

より便利です。

于 2012-05-22T09:51:29.720 に答える