Java中是否有一个数据结构(java util,guava ...)允许我存储“键值”对,它们也可以解释为值键?
示例:
Datastructure d = new Datastructure();
d.add(1, "foo");
d.add(21 "bar");
d.add(33 "hello");
d.add(55 "world");
类似d.get1(1)
的函数应返回foo
。
像d.get2("foo")
这样的函数应返回1
。
类似d.get1(33)
的函数应返回hello
。
像d.get2("hello")
这样的函数应返回33
。
...
是否有类似的作品?
答案 0 :(得分:2)
Apache Commons Collections库中的BidiMap接口及其一些实现。该界面提供了一种获取逆向映射的方法,即交换键和值的角色的映射。
如果您不想使用此类,则可以在内部使用两个映射轻松实现自己的类。
答案 1 :(得分:1)
Java中没有这样的类,但是您可以使用以下方法做您想做的事情:
Map<Object, Object> map = new HashMap<>();
map.put(1, "foo");
map.put(21, "bar");
map.put(33, "hello");
map.put(55, "world");
map.put("foo", 1);
map.put("bar", 21);
map.put("hello", 33);
map.put("world", 55);
System.out.println(map.get(1)); // foo
System.out.println(map.get("foo")); // 1
看起来很奇怪,但是可以根据需要工作。
或者您可以创建自己的类,根据需要工作,可以使用我展示的一张地图,也可以使用两张地图,例如:Map<Integer, String> map1... Map<String, Integer> map2...
希望有帮助。
答案 2 :(得分:1)
您正在寻找的内容基本上由Guava的BiMap
实现。
您可以像这样使用guava的BiMap-
BiMap<Integer, String> biMap = HashBiMap.create();
biMap.put(1, "foo");
biMap.put(21, "bar");
System.out.println(biMap.get("1"))); //foo
System.out.println(biMap.inverse().get("bar"))); //21
链接:
-Guide to guava BiMap
-BiMap Java文档
或者,您可以像这样使用apache common BiDiMap
:
BidiMap<String, String> map = new DualHashBidiMap<>();
map.put(1, "foo");
map.put(21, "bar");
System.out.println(map.get(1)); //1
//reversing the mapping
BidiMap<String, String> reversedMap = map.inverseBidiMap();
System.out.println(reversedMap.get("foo")); //1
答案 3 :(得分:1)
是的,Guava具有BiMap
接口,具有多种实现方式,包括HashBiMap
和ImmutableBiMap
,它们提供了inverse()
视图以进行反向查找。还请注意,与简单地在每个方向上存储一对地图相比,它们的实现效率更高-尽管在某种程度上,不可能构建出明显更好的实现。