2016-03-03 84 views
-1

下面是我的代碼拿到鑰匙...的Java地圖從價值

Map<Integer, String> MyType = sessionInfo.getType(); 
//{2=somename} 

我想從價值的關鍵......不運行任何環路....這可能嗎?

MyType.get("somename") // should output 2` 
+4

在map中,不可能直接獲取給定值的密鑰。 – Rahul

+2

如果多個鍵的值相同,你期望什麼? – vins

+0

在我的情況下..值不能相同.. –

回答

3

這並不容易擺脫價值關鍵在哈希表或HashMap中,相比以獲得密鑰的價值,因爲哈希映射或哈希表不強制執行Java中的Map內的鍵和值之間的一對一映射。 Infact Map允許將相同的值映射到HashMap,Hashtable或任何其他Map實現中的多個鍵。

 String key= null; 
     String value="somename"; 
     for(Map.Entry entry: MyType.entrySet()){ 
      if(value.equals(entry.getValue())){ 
       key = entry.getKey(); 
       break; //breaking because its one to one map 
      } 
     } 
1

我會鼓勵爲了簡單而運行循環。它很可能不會減慢你的程序一個明顯的數量。但是,如果您不能運行循環,Google的番石榴圖書館會有一個名爲BiMap的BiDirectional Map Collection,它可以是(found here)。地圖可以雙向運行,並且保證隨時都可以同步。我也假設你在地圖上有獨特的價值。如果你不這樣做,重複的值將沒有特定的關鍵鏈接。

BiMap<String, Integer> biMapInversed = biMap.inverse(); // how to get inverted map 

再說一遍,除非絕對必要,否則我不會鼓勵。循環播放在大多數情況下都可以很好地工作。

0

這是不可能的。您需要考慮可能在地圖中複製的值。 例如,你如何處理{2 = somename}和{5 = somename}

你仍然需要使用for循環來檢查值和獲取鍵,並決定打破或繼續進行值匹配。

0

如果您確定自己的值是唯一的,則可以遍歷舊映射的條目。

Map<String, Character> myNewHashMap = new HashMap<>(); 
for(Map.Entry<Character, String> entry : myHashMap.entrySet()){ 
    myNewHashMap.put(entry.getValue(), entry.getKey()); 
} 

或者,你可以使用一個雙向的地圖狀番石榴提供和使用逆()方法:

BiMap<Character, String> myBiMap = HashBiMap.create(); 
myBiMap.put('a', "test one"); 
myBiMap.put('b', "test two"); 

BiMap<String, Character> myBiMapInversed = myBiMap.inverse(); 
1

this SO answer

兩者如果您選擇使用的 的Commons Collections library而不是標準的Java集合API,您可以輕鬆實現這一目標。

在類別庫BidiMap接口是 雙向地圖,允許你映射一鍵的值(像正常 映射),並且還以映射的值的鍵,從而使用戶可以執行 在兩個方向上查找。通過getKey() method支持獲得值的密鑰 。

有一個警告,雖然,比迪地圖不能有映射到 多重鍵的值,因此除非你的數據集有1:鍵 和價值觀,你不能使用bidimaps之間1映射。