【问题标题】:Is there a data structure with 2 indizes / a key-key data-structure?是否有具有 2 个索引 / 一个键键数据结构的数据结构?
【发布时间】:2019-09-30 19:48:29
【问题描述】:

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

...

有这样的东西吗?

【问题讨论】:

  • Key 可以是唯一的,但 value 不能是唯一的,那么在这种情况下,您将如何通过 value 获取 Key ?到目前为止,Java 中还没有这样的功能。
  • 根据您所写的内容,您只需要一个 Map(例如 HashMap)
  • 嘿@Adam,你将如何在java中通过get(value)获取key。我知道有map。

标签: java dictionary data-structures key bimap


【解决方案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
- BiMapjava 文档

或者,您可以像这样使用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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&lt;Integer, String&gt; map1... Map&lt;String, Integer&gt; map2...

      希望对你有帮助。

      【讨论】:

      • 谢谢。这适用于我的简单示例。但是,如果它是 Map 例如条目 (3,1) 和 (2,3) ,则可能会出现问题。 map.put(1,3) 没问题,但是 map.put(3,2) 会覆盖 (3,1) 条目。
      • 在这种情况下使用 2 个不同的地图。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多