双向映射 -- BiMap

2017-04-07 23:56:20   最后更新: 2017-04-07 23:56:20   访问数量:191




有时我们需要维护一个双向映射,也就说,有时我们需要一个 key-value 的集合的同时还需要一个 value-key 的集合,那么,为了解决这个问题,我们需要维护两个 Map:

Map<Long, String> fruitIdToName = new HashMap<>(); Map<String, Long> fruitNameToId = new HashMap<>(); fruitIdToName.put(2L, "apple"); fruitIdToName.put(3L, "banana"); fruitNameToId.put("apple", 2L);

 

 

上面的代码维护了两个 HashMap,分别是水果 Id 到水果名称的映射,和水果名称到水果 Id 的映射

然而,维护两个 HashMap 的成本是很高的,你会发现在例子中,我们将无法通过 fruitIdToName 中存在的 banana 值作为 key 查找到 fruitNameToId 中的对应 Id

同时,HashMap 只能保证键的唯一,而无法保证值的唯一,对于不同的 key 映射到了同一个 value,那么我们将怎么来创建反向映射呢?

 

Guava 提供的 BiMap 解决了这个问题

 

BiMap 是一个接口,他继承了 jdk 的 Map 接口,因此 BiMap 支持 Map 的所有操作,在此基础上,BiMap 提供了两个方法:

BiMap 提供的方法
方法说明
V forcePut(K key, V value)根据 value,强制替换它对应的 key
BiMap inverse()获得反向映射后的 BiMap

 

BiMap 的实现
BiMapk-v实现v-k实现
HashBiMapHashMapHashMap
ImmutableBiMapImmutableMapImmutableMap
EnumBiMapEnumMapEnumMap
EnumHashBiMapEnumMapHashMap

 






技术帖      龙潭书斋      java      集合      map      hashmap      guava      bimap      enummap      键值对     


京ICP备15018585号