Guava使用之BiMap
来源:互联网 发布:一致性哈希 java实现 编辑:程序博客网 时间:2024/05/23 23:03
通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是一些应用场景中需要我们通过value获取key。这个时候如果用传统的方法就需要维护两个map,并且需要保持他们之间的同步。
对于值已经存在的情况,会变得非常混乱。例如:
Map<String, Integer> nameToId = Maps.newHashMap();Map<Integer, String> idToName = Maps.newHashMap(); nameToId.put("Bob", 42);idToName.put(42, "Bob");//如果"Bob"和42已经在map中了,会发生什么?//如果我们忘了同步两个map,会有诡异的bug发生...
这里面有两个问题:
1. 如何处理重复的value的情况。不考虑的话,反转的时候就会出现覆盖的情况.
2. 如果在反转的map中增加一个新的key,倒转前的map是否需要更新一个值呢?
这个时候使用BiMap就会非常简单解决,BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。
BiMap<K, V>是特殊的Map:
- 可以用 inverse()反转BiMap<K, V>的键值映射
- 保证值是唯一的,因此 values()返回Set而不是普通的Collection
在使用BiMap时,会要求Value的唯一性。如果value重复了则会抛出错误:java.lang.IllegalArgumentException
如果我们确实需要插入重复的value值,那可以选择forcePut方法。但是我们需要注意的是前面的key也会被覆盖了。
理解inverse方法
inverse方法会返回一个反转的BiMap,但是注意这个反转的map不是新的map对象,它实现了一种视图关联,这样你对于反转后的map的所有操作都会影响原先的map对象。例如:
@Testpublic void testBiMap(){ BiMap<Integer,String> logfileMap = HashBiMap.create(); logfileMap.put(1,"a.log"); logfileMap.put(2,"b.log"); logfileMap.put(3,"c.log"); System.out.println("logfileMap:"+logfileMap); BiMap<String,Integer> filelogMap = logfileMap.inverse(); System.out.println("filelogMap:"+filelogMap); logfileMap.put(4,"d.log"); System.out.println("logfileMap:"+logfileMap); System.out.println("filelogMap:"+filelogMap);}
输出的结果是:
logfileMap:{1=a.log, 2=b.log, 3=c.log}filelogMap:{a.log=1, b.log=2, c.log=3}logfileMap:{1=a.log, 2=b.log, 3=c.log, 4=d.log}filelogMap:{a.log=1, b.log=2, c.log=3, d.log=4}
阅读全文
0 0
- Guava使用之BiMap
- Guava学习之BiMap
- guava之BiMap
- Google Guava学习之BiMap
- guava之MultiSet、MultiMap和BiMap
- [Guava]——BiMap
- Java-类库-Guava-Bimap
- Guava collections -- BiMap
- JAVA学习笔记47——其他容器简介4:guava之MulitiSet、MultiMap、BiMap、Table
- guava之Multiset、Multimap、BiMap与Table_成绩表行转列JAVA136-137
- Guava学习——集合类BiMap
- Guava类库学习--Multiset+Multimap+BiMap
- Google Guava集合BiMap和Multimap
- [Guava源码日报](11)BiMap
- Guava使用之MultiMap
- Guava使用之MultiSet
- Guava使用之Preconditions
- Guava使用之Splitter
- tensorflow object_detection 用自己的数据训练目标检测模型Mobilenet
- 偷来的AWB原理
- EU3-11: Talking about flight arrangements
- 从常用指令入手了解Linux系统 (Learn Linux from shell commands)
- 直接插入排序 -- 个人见解
- Guava使用之BiMap
- javascript中字符串操作常用的API
- 数据操作之《排序套餐:冒泡、选择、插入、快速、归并》
- [阿里云服务之旅]阿里云部署JavaWeb项目初体验
- 【LeetCode解题一】Two Sum问题Java解答
- golang设计模式之工厂方法模式
- Elasticsearch+kibana搭建
- 《OpenGL v3.3》——(1)搭建glfw3与glew环境,并创建第一个窗口
- OpenGL扩展库使用手册《GLEW—The OpenGL Extension Wrangler Library》