2012-03-20 93 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