2012-05-22 9 views
51

私はJavaで単純な整数から文字列へのマッピングを持っていますが、整数から文字列を、文字列から整数を簡単に取得できる必要があります。それは一つの方法だ、私は地図を試してみたが、それは、整数から文字列のみを取得することができます。Javaの双方向マップですか?

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->"low", 2->"mid", 3->"high"を変更しないいくつかの定数値を持っているので、複雑な解決のために行く価値がないということです。あなたはそれのためにGoogleのコレクションAPIを使用することができます

答えて

50

最近Guavaに改名、具体BiMap

2領域マップ(又は「双方向マップ」) その値の一意ならびにその鍵とを保持するマップである。この制約 をサポートするためにbimapsを可能別のバイマークである「逆ビュー」 には、このバイマップと同じエントリが含まれていますが、キーは逆になり、 の値が含まれています。

+0

はhttp://stackoverflow.com/a/39329395/5466401参照 –

16

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

8

はApache Commonsのコレクションのそれはより便利であるBidiMap

4

使用GoogleのBiMap

を持っています。

21

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")); 
    } 
} 
5

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

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

使い方map.get( "theValue")は "theKey"を返します。

それは私が唯一選ばれた少数のデータセットのために動作します一定のマップを、作った間に合わせの方法です:

  • は、値のセットと共通部分を持たない唯一の1対1のペア
  • が含まれていますキーのセット(> 2 1-、2-> 3休憩それは)

あなたが<Integer, String>を維持したい場合は、値を「入れる」ために、第2 <String, Integer>マップを維持することができ - >キーのペア。

+5

あなたのキーと値が同じである、またはあなたが '地図<オブジェクト、オブジェクト>を使用している場合、おそらく' – mlathe

+0

明確化のために編集された場合にのみ動作し、さらに感謝 – Chicowitz

+0

をすべてのキーと値は異なるはずです。 –

関連する問題