103

我在 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",所以不值得去寻求一个复杂的解决方案。

4

6 回答 6

92

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

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

于 2012-05-22T09:44:40.333 回答
48

创建 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"));
  }
}
于 2013-03-21T07:15:48.973 回答
28

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

于 2012-05-22T09:45:23.220 回答
14

您可以将键、值对及其逆对插入映射结构,但必须将 Integer 转换为字符串:

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

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

这是我制作常量映射的一种快速而肮脏的方式,它只适用于少数几个数据集:

  • 仅包含 1 对 1 对
  • 值集与键集不相交(1->2、2->3 破坏它)

如果你想保留<Integer, String>,你可以维护第二个<String, Integer>映射来“放置”值 -> 键对。

于 2013-11-19T17:12:42.760 回答
11

Apache commons 集合有一个BidiMap

于 2012-05-22T09:45:50.333 回答
5

使用谷歌的BiMap

它更方便。

于 2012-05-22T09:51:29.720 回答