Google Guava BiMaps
接下来的番石榴之旅,是另一种有用的收藏类型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相关推荐
- 谷歌guava_Google Guava BiMaps
谷歌guava 接下来的番石榴之旅是另一个有用的收藏类型BiMap . 实际上,这非常简单,BiMap只是双向地图. 反转地图 普通的Java映射是一组键和值,您可以按键查找值,这非常有用,例如,说我 ...
- 谷歌guava_使用Google Guava进行馆藏创建和不变性
谷歌guava 因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型. 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– ...
- 使用Google Guava创建收藏和实现不变性
因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型. 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– BiMaps 番 ...
- Google Guava多集
继续这次番石榴之旅,我们到达了Multiset . 我可能不像Multimaps或Bimaps那样使用它,但是它确实有它的用途. 那么什么是多重集? 也许您可以猜到它是一个可以容纳同一对象的多个实例的 ...
- Google Guava MultiMaps
番石榴 这是系列文章中的第一篇,我将尝试解释和探索Google很棒的Guava java库 . 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Guava)–我需 ...
- 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 ...
- 为什么我不建议你用阿里巴巴Java规范,而使用 Google Guava 编程?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自 | 张丰哲 链接 | www.jianshu.com ...
- 为什么推荐 Java 程序员使用 Google Guava 编程
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自 | 张丰哲 链接 | www.jianshu.com/p/97778b21bd00 前言 ...
- [Google Guava] 1.3-常见Object方法
原文链接 译者: 沈义扬 equals 当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查.使用Objects.equal帮助你执行n ...
最新文章
- 无法嵌入互操作类型...请改用适用的接口 解决办法
- Intellij IDEA中生成jar包
- 基础算法 —— 贪心算法
- pat1085. Perfect Sequence (25)
- 【Groovy】Groovy 运算符重载 ( 运算符重载 | 运算符重载对应方法 )
- 信息系统项目管理师_信息系统项目管理师历史文章总结
- 看得懂的外观设计模式 python3 实现
- axure 小程序 lib_使用maven和fat jar/war运行应用程序的对比
- mysql延迟注入br,实验3—SQL注入漏洞的攻击与防御(基于时间延迟的盲注)
- Fluent Ribbon项目出现“命名空间“clr-namespace:Fluent;assembly=Fluent”中不存在“RibbonWindow”名称”的解决方法...
- User breakpoint called from code at 0x771064f4
- IEC 60335 全系列- 家用和类似用途电器 - 包含全部106份最新英文版标准文件
- 2019DTCC大会感受
- java 重写或者覆父类方法的使用throws 抛出异常,为什么要小于父类父类,java面试点
- 类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...
- HTML生成PDF、web打印动态分页、预览。内容满了,自动换页、移动端兼容 bookjs-eazy
- 第 4 题 打折日期交叉问题
- 基于VMD变分模态分解算法Python程序
- IL思路及遇到的问题、解决方法
- 品悟C 抛弃C程序设计中的谬误与恶习 pdf
热门文章
- java.util.concurrent.locks.Condition文档说明
- ReviewForJob(3)表、栈和队列
- 常见 Java 字节码 指令 助记符
- 局域网物理机怎么访问虚拟机
- idea 构建spring_以Spring方式构建企业Java应用程序
- javafx 遮罩_JavaFX技巧31:遮罩/剪切/ Alpha通道
- spring @lazy_Spring @Lazy批注用例
- javaone_JavaOne 2016后续活动
- 性能测试流程_流性能
- java java se_Java 8 SE可选,严格的方法