Java Collection - 独特的关键和独特的价值

时间:2009-04-02 21:03:11

标签: java collections

我需要一个可以根据键查找值的集合,反之亦然。对于每个值,都有一个键,每个键都有一个值。是否存在可以使用的数据结构?

3 个答案:

答案 0 :(得分:32)

来自BiMapGoogle Guava看起来很适合你。

  

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

来自BidiMapApache Commons Collections

  

定义允许在键和值之间进行双向查找的映射。

     

此扩展Map表示一个映射,其中键可以查找值,值可以轻松查找键。此接口扩展Map,因此可以在需要地图的任何地方使用。界面提供反向地图视图,可以完全访问BidiMap的两个方向。

答案 1 :(得分:7)

您可以使用BiMap(以前的GS Collections)中的Eclipse Collections

BiMap是一个允许用户从两个方向执行查找的地图。 BiMap中的键和值都是唯一的。

主要实施是HashBiMap

<强> inverse()

BiMap.inverse()返回一个视图,其中交换了键类型和值类型的位置。

MutableBiMap<Integer, String> biMap =
  HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));

<强> put()

MutableBiMap.put()在常规地图上的行为与Map.put()相似,只是在添加重复值时会抛出。

MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException

<强> forcePut()

此行为与MutableBiMap.put()类似,但在将键值对放入地图之前,它会以静默方式删除具有相同值的映射条目。

MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.put(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.forcePut(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "2"), biMap);

注意:我是Eclipse Collections的提交者。

答案 2 :(得分:1)

接受的答案提到了BiMap,但它与Google Guava图书馆成了more up-to-date

  

BiMap<K, V>Map<K, V>

     
      
  • 允许您使用BiMap<V, K>
  • 查看“反向”inverse()   
  • 确保值是唯一的,使values()成为Set
  •   

所以,你最终可以得到这样的代码:

final BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("word", 1);
biMap.put("alpha", 2);
System.out.println(biMap.get("word")); // prints 1
System.out.println(biMap.inverse().get(1)); // prints word

有关此对象的一些警告: