我需要一个数据结构来以1:1的关系存储string-int值对,并且能够从对应的任何一种方式查找。
我用Hashtable和String数组编写了一个类,并将数据存储了2次,并使用内置函数进行查找。
我的问题是,是否有更好的方法来实现这一目标?更好的是,我的意思是效率高,不存储数据2次,最好不要写大量的代码:P。
答案 0 :(得分:52)
看起来你可能正在寻找一个bimap。
Google Collections(现在是Guava的一部分)包含一个BiMap
界面,其中包含一些实现。
来自BiMap
文档:
bimap(或“双向地图”)是一个 保留唯一性的地图 它的价值以及它的价值 键。此约束启用了bimaps 支持“逆视图”,即 另一个含有相同的bimap 作为这个bimap的条目,但有 反转键和值。
BiMap.inverse
方法似乎返回Map
,其中值为键,键为值,因此Map
可用于调用get
在值上并检索一个键。
此外,Map
返回的inverse
是基础数据的视图,因此不必为原始数据制作额外的副本。
来自BiMap.inverse
方法文档:
返回此视图的反向视图 bimap,映射每个bimap的 值与其关联的键。他们俩 bimaps由相同的数据支持; 任何更改都会出现在 其他
答案 1 :(得分:30)
你可以这样做一个简单的实现。请注意,此实现中不会复制数据。只有参考文献!我添加了add和get的实现。删除和其他所需方法留作练习:)
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"));
答案 2 :(得分:11)
Apache Commons还包括BidiMap(Bi Directional Map)。
定义允许在键和值之间进行双向查找的映射。
此扩展Map表示键可以查找值的映射 并且值可以同样容易地查找键。此接口扩展 地图等可以在需要地图的任何地方使用。界面 提供反向地图视图,实现对两个方向的完全访问 BidiMap。
答案 3 :(得分:5)
Google Guava有一个BiMap可以满足您的需要。
答案 4 :(得分:4)
使用Guava,
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"));
阅读完整教程here.
答案 5 :(得分:0)
绝对不用在 lambda 中编写大量代码 →
从你的 Map<String,Integer> map
你得到倒置的地图
Map<Integer,String> inverted = map.keySet().stream().collect(
toMap( s -> map.get( s ), s -> s ) );
答案 6 :(得分:-4)
创建一个将Object映射到Object的hashmap - 然后你可以使用相同的map来存储String - &gt;整数和整数 - &gt;字符串。
添加字符串/ int对时,只需将它们两种方式添加到同一个地图中即可。