2012-03-20 115 views
34

你可以建議一種地圖或類似的數據結構,我們可以同時獲得彼此的價值和關鍵。也就是說,每個都可以用來找到其他的。雙向映射

+3

你可以讓你自己的類包含兩個hasmaps,每個方向一個,並且並行管理它們。明顯的缺點是存儲空間和性能時間加倍。 – 2012-03-20 07:48:30

+1

[java-hashmap-how-to-get-key-value-value](http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key-from-value) – jaco0646 2014-03-22 16:44:41

+0

看到這個簡單的答案http://stackoverflow.com/a/39329515/5466401 – 2016-09-05 11:22:59

回答

9

最常見的解決方案是使用兩張地圖。通過擴展AbstractMap,您可以輕鬆地將它們封裝在一個友好的界面中。 (更新:這是如何實現番石榴的HashBiMap:兩個地圖)

使用什麼,但使用數組和自定義類創建一個新的數據結構有幾個優點。映射實現是索引鍵的數據結構的輕量級包裝器。既然你需要兩個索引,你可以使用兩個完整的地圖。

28

Java在其標準庫中沒有雙向映射。

例如使用來自Google GuavaBiMap<K, V>

+0

@Travis謝謝,鏈接更新。 (API文檔目前仍在谷歌代碼中)。 – Jesper 2015-04-22 18:49:09

+0

是的,我注意到他們太希望他們會搬到更安全的地方。 – Travis 2015-04-22 18:56:10

+0

@Travis他們都是來自谷歌,所以他們可能不會搞砸自己的項目... – Jesper 2015-04-22 19:22:48

5

Google Guava包含BiMap(雙向映射)。

+0

你應該更新鏈接指向Github我打算,但認爲這可能是微不足道的,因爲當前的鏈接工程目前。 – Travis 2015-04-22 18:12:28

+0

在適當的時候。我知道Google代碼處於只讀模式。 – 2015-04-22 21:16:47

10

如果您感覺疼痛導入某些第三方庫。 這個簡單的課程如何?

public class BiMap<K,V> { 

    HashMap<K,V> map = new HashMap<K, V>(); 
    HashMap<V,K> inversedMap = new HashMap<V, K>(); 

    void put(K k, V v) { 
     map.put(k, v); 
     inversedMap.put(v, k); 
    } 

    V get(K k) { 
     return map.get(k); 
    } 

    K getKey(V v) { 
     return inversedMap.get(v); 
    } 

} 

確保K和V類具有正確的hashCode實現。

+0

問題是,這現在不是一個集合,所以所有的集合方法都不起作用。 – Justin 2016-07-12 19:41:06

+0

爲真。我最終添加了我需要的東西 – Javanator 2016-07-13 06:33:46

2

對於需要這樣的字典的普通用例來說,我發現KISS解決方案沒有什麼錯,只是把鍵和值反過來,節省了第二個地圖甚至庫的開銷,目的:

myMap.put("apple", "Apfel"); 
myMap.put("Apfel", "apple"); 
+1

請注意,這僅適用於鍵和值是相同類型的情況,並且您不會再知道哪一個是關鍵字,哪一個是有價值的。在某些情況下可以很好。 – Literallie 2016-09-21 11:53:02