Java中的双向映射?

时间:2012-05-22 09:42:03

标签: java map guava apache-commons

我在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);

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

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

6 个答案:

答案 0 :(得分:66)

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

  

bimap(或&#34;双向地图&#34;)是保留地图的地图   其价值的独特性以及其价值的独特性。这个约束   使bimaps支持&#34;反向视图&#34;,这是另一个bimap   包含与此bimap相同的条目,但使用反向键和   值。

答案 1 :(得分:30)

创建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"));
  }
}

答案 2 :(得分:20)

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

答案 3 :(得分:8)

Apache commons集合有一个BidiMap

答案 4 :(得分:8)

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

map.put("theKey", "theValue");
map.put("theValue", "theKey");

使用map.get(“theValue”)将返回“theKey”。

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

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

如果您想保留<Integer, String>,可以保留第二张<String, Integer>地图以“放置”该值 - &gt;密钥对。

答案 5 :(得分:4)

使用Google BiMap

更方便。