如何在java中创build一个2路地图
我需要一个数据结构以1:1的关系存储string-int值对,并且能够以任何方式查找对应的对象。
我用一个Hashtable和一个String数组写了一个类,并存储了数据2次,并使用内置函数进行查找。
我的问题是,有没有更好的方法来完成这个? 而更好的说,我的意思是高效的,而不是存储数据2次,最好不写一吨的代码:P。
看来你可能正在寻找一个bimap。
Google Collections(现在是Guava的一部分)包含一个BiMap
接口和几个实现。
从BiMap
文档:
bimap(或“双向映射”)是一个映射,保留其值和键的唯一性。 这个约束使得bimaps支持“反向视图”,这是另一个bimap包含与这个bimap相同的条目,但是具有相反的键和值。
BiMap.inverse
方法似乎返回一个Map
,其值为键,键为值,以便Map
可以用来调用get
值并检索键。
另外,由inverse
返回的Map
是底层数据的视图,所以不需要额外拷贝原始数据。
从BiMap.inverse
方法文档:
返回此bimap的反向视图,它将每个bimap的值映射到与其关联的键。 这两个bimaps是由相同的数据支持; 对另一个的任何更改将出现在另一个。
你可以像这样做一个简单的实现。 请注意,在这个实现中不会复制数据。 只有参考是! 我已添加实现添加和获取。 删除和其他所需的方法是作为运动:)
public class TwoWayHashmap<K extends Object, V extends Object> { private Map<K,V> forward = new Hashtable<K, V>(); private Map<V,K> backward = new Hashtable<V, K>(); public synchronized void add(K key, V value) { forward.put(key, value); backward.put(value, key); } public synchronized V getForward(K key) { return forward.get(key); } public synchronized K getBackward(V key) { return backward.get(key); } }
当然,其应用的责任,即使是“价值观”也是唯一的。 用法示例:
TwoWayHashmap twmap = new TwoWayHashmap<String, String>(); twmap.add("aaa", "bbb"); twmap.add("xxx", "yyy"); System.out.println(twmap.getForward("xxx")); System.out.println(twmap.getBackward("bbb"));
Apache Commons还包括双向地图(Bi Directional Map)。
定义允许在键和值之间进行双向查找的映射。
这个扩展的Map代表一个映射,一个键可以查找一个值,一个值可以轻松地查找一个键。 这个接口扩展了Map,因此可以在需要地图的任何地方使用。 该界面提供了一个反向地图视图,可以完全访问双向地图的两个方向。
Google Collections框架有一个BiMap ,可以做你想做的事情。
使用番石榴 ,
HashBiMap<String, String> map = HashBiMap.create(); map.put("name", "Sohail"); map.put("country", "Pakistan"); Log.d("tag", "name is " + map.get("name")); BiMap<String, String>invmap= map.inverse(); Log.d("tag", "Pakistan is a " + invmap.get("Pakistan"));
在这里阅读完整教程。
创build一个将Object映射到Object的散列表 – 然后您可以使用相同的映射来存储String – > Integer和Integer – > String。
当你添加一个string/ int对时,只需将它添加到同一个地图。