是否有具有 2 个索引/键-键数据结构的数据结构?
Is there a data structure with 2 indizes / a key-key data-structure?
Java(java util、guava...)中是否有一个数据结构允许我存储 "key value" 对也可以解释为值键?
示例:
Datastructure d = new Datastructure();
d.add(1, "foo");
d.add(21 "bar");
d.add(33 "hello");
d.add(55 "world");
像 d.get1(1)
这样的函数应该 return foo
。
像 d.get2("foo")
这样的函数应该 return 1
.
像 d.get1(33)
这样的函数应该 return hello
。
像 d.get2("hello")
这样的函数应该 return 33
.
...
有这样的东西吗?
在 Apache 公共集合库中是 BidiMap 接口及其一些实现。该接口有一个获取逆映射的方法,即交换键和值角色的映射。
如果您不想使用此 class,您可以在内部使用两个地图轻松实现您自己的 class。
Java中没有这样的class,但是你可以用这个做你想做的:
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
看起来很奇怪,但随心所欲。
或者您可以根据需要创建自己的 class,可以使用我展示的一张地图,或者两张地图,例如:Map<Integer, String> map1... Map<String, Integer> map2...
希望对您有所帮助。
你要找的基本上是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
Link:
- 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
是的,Guava 有 BiMap
接口,有多种实现,包括 HashBiMap
和 ImmutableBiMap
,它们提供了一个 inverse()
视图来进行反向查找.另请注意,与简单地存储一对地图(每个方向一个)相比,它们的实现效率更高——尽管在某种程度上,不可能构建 显着 更好的实现。
Java(java util、guava...)中是否有一个数据结构允许我存储 "key value" 对也可以解释为值键?
示例:
Datastructure d = new Datastructure();
d.add(1, "foo");
d.add(21 "bar");
d.add(33 "hello");
d.add(55 "world");
像 d.get1(1)
这样的函数应该 return foo
。
像 d.get2("foo")
这样的函数应该 return 1
.
像 d.get1(33)
这样的函数应该 return hello
。
像 d.get2("hello")
这样的函数应该 return 33
.
...
有这样的东西吗?
在 Apache 公共集合库中是 BidiMap 接口及其一些实现。该接口有一个获取逆映射的方法,即交换键和值角色的映射。
如果您不想使用此 class,您可以在内部使用两个地图轻松实现您自己的 class。
Java中没有这样的class,但是你可以用这个做你想做的:
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
看起来很奇怪,但随心所欲。
或者您可以根据需要创建自己的 class,可以使用我展示的一张地图,或者两张地图,例如:Map<Integer, String> map1... Map<String, Integer> map2...
希望对您有所帮助。
你要找的基本上是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
Link:
- 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
是的,Guava 有 BiMap
接口,有多种实现,包括 HashBiMap
和 ImmutableBiMap
,它们提供了一个 inverse()
视图来进行反向查找.另请注意,与简单地存储一对地图(每个方向一个)相比,它们的实现效率更高——尽管在某种程度上,不可能构建 显着 更好的实现。