是否有2个索引/键-键数据结构的数据结构?

时间:2019-05-13 20:16:29

标签: java dictionary data-structures key bimap

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

...

是否有类似的作品?

4 个答案:

答案 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接口,具有多种实现方式,包括HashBiMapImmutableBiMap,它们提供了inverse()视图以进行反向查找。还请注意,与简单地在每个方向上存储一对地图相比,它们的实现效率更高-尽管在某种程度上,不可能构建出明显更好的实现。