Java中的双向映射是什么?

120

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

我在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"),所以采用复杂的解决方案不值得。


这篇关于Java中双向映射的文章展示了一种基于这个教程的解决方案。 - Simeon
6个回答

98
你可以使用Google Collections API实现这一功能,该API最近更名为Guava,具体来说是一个BiMap

一个bimap(或“双向映射”)是一种保留其键和值的唯一性的映射。这个限制使得bimap能够支持“反向视图”,即另一个包含与此bimap相同条目但键和值翻转的bimap。


请查看http://stackoverflow.com/a/39329395/5466401。 - Sibin John Mattappallil
3
Google可能需要BiMap来满足特定的使用情况。但是,为什么Java没有提供BiMap呢?在数据结构和算法中拥有选项而不是从库或从头开始编码是很好的。 - MasterJoe

54

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

21
这个例子如何说明这不是“那么琐碎”? - Guildenstern

31

在Java标准API中没有双向映射,您可以自己维护两个映射表,或者使用Apache Collections提供的BidiMap


4
BidiMap bidiMap = new DualHashBidiMap(); 这样。 - Kanagavelu Sugumar
但是这个没有泛型支持 :( - Kanagavelu Sugumar
4
未来的读者 -- 目前这个已经支持泛型。 - Richard Rast
现在它具有通用支持。 - Bala

16

你可以将键值对及其反转插入到映射结构中,但必须将Integer转换为字符串:

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

使用map.get("theValue")将会返回"theKey"。

这是我制作常量映射的一种快速而简单的方法,但只适用于少数数据集:

  • 包含仅为1对1关系
  • 值的集合与键的集合无交集 (1->2, 2->3 会破坏此规则)

如果您想保持 <Integer, String>,您可以维护第二个<String, Integer>映射来“put”值->键对。


3
此外,所有的键和值都应该是不同的。 - Mert Mertce
8
这个回答纯属亵渎之言,所以我很喜欢它 :) - Gewure
这是一个很棒的黑客技巧。 - Ben

11

Apache commons collections有一个BidiMap

的功能。


5

使用谷歌的BiMap更加方便。

它非常实用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接