接下来的番石榴之旅,是另一种有用的收藏类型BiMap 。 实际上,这非常简单,BiMap只是双向地图。
反转地图
普通的Java映射是一组键和值,您可以按键查找值,这非常有用,例如,说我想创建一个(非常原始的)英式英语到美式英语词典:
Map<String,String> britishToAmerican = Maps.newHashMap();
britishToAmerican.put('aubergine','egglant');
britishToAmerican.put('courgette','zucchini');
britishToAmerican.put('jam','jelly');
但是,如果您要一本美英词典呢? 好吧,您可以编写一些代码来反转地图:
// Generic method to reverse map.public %lt;S,T> Map<T,S> getInverseMap(Map<S,T> map) {Map<T,S> inverseMap = new HashMap<T,S>();for(Entry<S,T> entry: map.entrySet()) {inverseMap.put(entry.getValue(), entry.getKey());}return inverseMap;}
它可以完成工作,但是您可能需要考虑一些复杂问题。
- 我们如何处理原始地图中的重复值? 此刻,它们将在反向图中被无声覆盖。
- 如果我们想在反向地图中放置一个新条目怎么办? 我们还必须更新原始地图! 这可能会令人讨厌。
双图
好吧,你猜怎么着? BiMap就是为这种情况而设计的! 这就是您可能会使用它的方式。
BiMap<String,String> britishToAmerican = HashBiMap.create();// Initialise and use just like a normal map
britishToAmerican.put('aubergine','egglant');
britishToAmerican.put('courgette','zucchini');
britishToAmerican.put('jam','jelly');System.out.println(britishToAmerican.get('aubergine')); // eggplantBiMap<String,String> americanToBritish = britishToAmerican.inverse();System.out.println(americanToBritish.get('eggplant')); // aubergine
System.out.println(americanToBritish.get('zucchini')); // courgette
确实很简单,但是有一些注意事项。
加强独特性
首先,BiMap强制其值具有唯一性,如果您尝试插入重复的值,则会给您一个非法的参数异常,即
britishToAmerican.put('pudding','dessert');
britishToAmerican.put('sweet','dessert'); // IllegalArgumentException.
如果您需要添加已经添加的值,则可以使用forcePut
方法将重复的值覆盖条目。
britishToAmerican.put('pudding','dessert');
britishToAmerican.forcePut('sweet','dessert'); // Overwrites the previous entry
System.out.println(britishToAmerican.get('sweet')); // dessert
System.out.println(britishToAmerican.get('pudding')); // null
逆法
要理解的另一个关键问题是inverse
方法,它返回逆BiMap,即具有键和值进行轮换的映射。
现在,此反向映射不仅仅是一个新映射,例如我先前创建的reverseMap方法。 它实际上是原始地图的视图 。 这意味着对逆方法的任何后续更改都会影响原始地图!
americanToBritish.put('potato chips','crisps');
System.out.println(britishToAmerican.containsKey('crisps')); // true
System.out.println(britishToAmerican.get('crisps')); // potato chips
正如我所说的,这就是BiMap。 像往常一样,有几种实现方式,并且我建议像以往一样阅读完整的API文档:
http://guava-libraries.googlecode.com/svn/tags/release09/javadoc/com/google/common/collect/BiMap.html
参考: Tom's Programming Blog博客上的JCG合作伙伴 Tom Jefferys提供的Google Guava BiMaps 。
翻译自: https://www.javacodegeeks.com/2012/12/google-guava-bimaps.html