2012-05-22 105 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"幾個固定值,所以它就不值得去一個複雜的解決方案。

回答

50

您可以使用谷歌集合API爲最近重命名爲Guava,特別是BiMap

甲bimap的(或「雙向映射」)是地圖,可以保留 唯一其值以及它的密鑰。該約束 使bimaps支持一個「反觀」,這是另一個bimap 包含與此bimap相同的條目但具有反轉鍵和 值。

+0

見http://stackoverflow.com/a/39329395/5466401 –

16

Java Standard API中沒有雙向映射。您可以自己維護兩張地圖,也可以使用Apache集合中的BidiMap

21

創建番石榴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雙
  • 設置的值是不相交組鍵(1> 2,2-> 3擊穿它)

如果你想保持<Integer, String>你可以保持第二<String, Integer>地圖「放」的價值 - >密鑰對。

+5

只有當您的鍵和值是相同的,或者可能是如果你使用'地圖<對象,對象>' – mlathe

+0

編輯澄清工作,感謝 – Chicowitz

+0

此外,所有的鍵和值都應該不同。 –