2

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

4 回答 4

2

在 Apache 公共集合库中是BidiMap接口及其一些实现。该接口有一个获取逆映射的方法,即交换键和值的角色的映射。

如果您不想使用此类,则可以在内部使用两个映射轻松实现自己的类。

于 2019-05-13T20:21:58.020 回答
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

链接:
-番石榴 BiMap 指南
- BiMap java doc

或者,您可以像这样使用 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
于 2019-05-13T20:33:22.410 回答
1

是的,Guava 有BiMap接口,有多种实现,包括HashBiMapand ImmutableBiMap,它提供了一个inverse()视图来进行反向查找。还要注意,它们的实现比简单地存储一对地图更有效,每个方向一个——尽管在某种程度上,不可能构建一个明显更好的实现。

于 2019-05-13T20:33:37.267 回答
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...

希望能帮助到你。

于 2019-05-13T20:26:56.327 回答