Java中的双向映射?

Dan*_*jel 79 java map apache-commons guava

我在Java中有一个简单的整数到字符串映射,但我需要能够轻松地从整数中检索字符串,并且还能从字符串中检索整数.我已经尝试了Map,但它只能从整数中检索字符串,这是一种方式:

private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
// This works one way:
String myString = myMap.get(myInteger);

// I would need something like:
Integer myInteger = myMap.getKey(myString);
Run Code Online (Sandbox Code Playgroud)

有没有正确的方法来实现这两个方向?

另一个问题是我只有一些不会改变的常数值(1->"low", 2->"mid", 3->"high"因此,找一个复杂的解决方案是不值得的.

epo*_*och 75

您可以使用Google Collections API,最近重命名为Guava,特别是BiMap

bimap(或"双向映射")是一种映射,它保留其值及其键的唯一性.此约束使bimaps支持"反向视图",这是另一个包含与此bimap相同的条目但具有反向键和值的bimap.

  • Google 可能需要 BiMap 来满足特定的用例。但是,为什么Java不提供BiMap呢?拥有数据结构和算法方面的选择,而不必从库中获取它们或从头开始编码,这很好。 (3认同)

Mic*_*d a 37

创建Guava BiMap并获得倒置值并非如此微不足道.

简单的例子:

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

public class BiMapTest {

  public static void main(String[] args) {

    BiMap<String, String> biMap = HashBiMap.create();

    biMap.put("k1", "v1");
    biMap.put("k2", "v2");

    System.out.println("k1 = " + biMap.get("k1"));
    System.out.println("v2 = " + biMap.inverse().get("v2"));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个例子如何说明它“不那么微不足道”? (13认同)

Mat*_*arz 22

Java Standard API中没有双向映射.您可以自己维护两个地图,也可以使用Apache Collections中的BidiMap.

  • 就像`BidiMap bidiMap = new DualHashBidiMap();` (2认同)
  • 对于未来的读者——目前确实有泛型支持 (2认同)

hag*_*age 10

Apache commons集合有一个BidiMap


Chi*_*itz 10

您可以将键,值对及其反转插入到地图结构中,但必须将整数转换为字符串:

map.put("theKey", "theValue");
map.put("theValue", "theKey");
Run Code Online (Sandbox Code Playgroud)

然后使用map.get("theValue")将返回"theKey".

这是一种快速而肮脏的方式,我制作了恒定的地图,这只适用于少数几个数据集:

  • 仅包含1对1对
  • 一组值与键组不相交(1-> 2,2-> 3打破它)

如果你想保持<Integer, String>你可以保持第二个<String, Integer>地图"放"值 - >密钥对.

  • 仅当您的Key和Value相同时才有效,或者如果您使用`Map <Object,Object>` (5认同)
  • 此外,所有的键和值都应该不同。 (3认同)
  • 这个答案纯属亵渎。那就是为什么我喜欢它:) (3认同)

BOS*_*OSS 5

使用 Google 的BiMap

这样更方便。