接下来的番石榴之旅,是另一种有用的收藏类型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

Google Guava BiMaps相关推荐

  1. 谷歌guava_Google Guava BiMaps

    谷歌guava 接下来的番石榴之旅是另一个有用的收藏类型BiMap . 实际上,这非常简单,BiMap只是双向地图. 反转地图 普通的Java映射是一组键和值,您可以按键查找值,这非常有用,例如,说我 ...

  2. 谷歌guava_使用Google Guava进行馆藏创建和不变性

    谷歌guava 因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型. 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– ...

  3. 使用Google Guava创建收藏和实现不变性

    因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型. 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– BiMaps 番 ...

  4. Google Guava多集

    继续这次番石榴之旅,我们到达了Multiset . 我可能不像Multimaps或Bimaps那样使用它,但是它确实有它的用途. 那么什么是多重集? 也许您可以猜到它是一个可以容纳同一对象的多个实例的 ...

  5. Google Guava MultiMaps

    番石榴 这是系列文章中的第一篇,我将尝试解释和探索Google很棒的Guava java库 . 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Guava)–我需 ...

  6. Error:Could not download guava.jar (com.google.guava:guava:19.0): No cached version available for of

    今天从git导入demo 报错 Error:Could not download guava.jar (com.google.guava:guava:19.0): No cached version ...

  7. 为什么我不建议你用阿里巴巴Java规范,而使用 Google Guava 编程?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自 | 张丰哲 链接 | www.jianshu.com ...

  8. 为什么推荐 Java 程序员使用 Google Guava 编程

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自 | 张丰哲 链接 | www.jianshu.com/p/97778b21bd00 前言 ...

  9. [Google Guava] 1.3-常见Object方法

    原文链接 译者: 沈义扬 equals 当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查.使用Objects.equal帮助你执行n ...

最新文章

  1. 无法嵌入互操作类型...请改用适用的接口 解决办法
  2. Intellij IDEA中生成jar包
  3. 基础算法 —— 贪心算法
  4. pat1085. Perfect Sequence (25)
  5. 【Groovy】Groovy 运算符重载 ( 运算符重载 | 运算符重载对应方法 )
  6. 信息系统项目管理师_信息系统项目管理师历史文章总结
  7. 看得懂的外观设计模式 python3 实现
  8. axure 小程序 lib_使用maven和fat jar/war运行应用程序的对比
  9. mysql延迟注入br,实验3—SQL注入漏洞的攻击与防御(基于时间延迟的盲注)
  10. Fluent Ribbon项目出现“命名空间“clr-namespace:Fluent;assembly=Fluent”中不存在“RibbonWindow”名称”的解决方法...
  11. User breakpoint called from code at 0x771064f4
  12. IEC 60335 全系列- 家用和类似用途电器 - 包含全部106份最新英文版标准文件
  13. 2019DTCC大会感受
  14. java 重写或者覆父类方法的使用throws 抛出异常,为什么要小于父类父类,java面试点
  15. 类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...
  16. HTML生成PDF、web打印动态分页、预览。内容满了,自动换页、移动端兼容 bookjs-eazy
  17. 第 4 题 打折日期交叉问题
  18. 基于VMD变分模态分解算法Python程序
  19. IL思路及遇到的问题、解决方法
  20. 品悟C 抛弃C程序设计中的谬误与恶习 pdf

热门文章

  1. java.util.concurrent.locks.Condition文档说明
  2. ReviewForJob(3)表、栈和队列
  3. 常见 Java 字节码 指令 助记符
  4. 局域网物理机怎么访问虚拟机
  5. idea 构建spring_以Spring方式构建企业Java应用程序
  6. javafx 遮罩_JavaFX技巧31:遮罩/剪切/ Alpha通道
  7. spring @lazy_Spring @Lazy批注用例
  8. javaone_JavaOne 2016后续活动
  9. 性能测试流程_流性能
  10. java java se_Java 8 SE可选,严格的方法