BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。
  通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,我们就需要额外编写一些代码了。首先来看下面一种表示标识序号和文件名的map结构。

  1. @Test
  2. public void logMapTest(){
  3. Map<Integer,String> logfileMap = Maps.newHashMap();
  4. logfileMap.put(1,"a.log");
  5. logfileMap.put(2,"b.log");
  6. logfileMap.put(3,"c.log");
  7. System.out.println("logfileMap:"+logfileMap);
  8. }

  当我们需要通过序号查找文件名,很简单。但是如果我们需要通过文件名查找其序号时,我们就不得不遍历map了。当然我们还可以编写一段Map倒转的方法来帮助实现倒置的映射关系。

  1. /**
  2. * 逆转Map的key和value
  3. * @param <S>
  4. * @param <T>
  5. * @param map
  6. * @return
  7. */
  8. public static <S,T> Map<T,S> getInverseMap(Map<S,T> map) {
  9. Map<T,S> inverseMap = new HashMap<T,S>();
  10. for(Entry<S,T> entry: map.entrySet()) {
  11. inverseMap.put(entry.getValue(), entry.getKey());
  12. }
  13. return inverseMap;
  14. }
  1. @Test
  2. public void logMapTest(){
  3. Map<Integer,String> logfileMap = Maps.newHashMap();
  4. logfileMap.put(1,"a.log");
  5. logfileMap.put(2,"b.log");
  6. logfileMap.put(3,"c.log");
  7.  
  8. System.out.println("logfileMap:"+logfileMap);
  9.  
  10. Map<String,Integer> logfileInverseMap = Maps.newHashMap();
  11.  
  12. logfileInverseMap=getInverseMap(logfileMap);
  13.  
  14. System.out.println("logfileInverseMap:"+logfileInverseMap);
  15. }

  上面的代码可以帮助我们实现map倒转的要求,但是还有一些我们需要考虑的问题:
      1. 如何处理重复的value的情况。不考虑的话,反转的时候就会出现覆盖的情况.
      2. 如果在反转的map中增加一个新的key,倒转前的map是否需要更新一个值呢?
  在这种情况下需要考虑的业务以外的内容就增加了,编写的代码也变得不那么易读了。这时我们就可以考虑使用Guava中的BiMap了。

  Bimap

  Bimap使用非常的简单,对于上面的这种使用场景,我们可以用很简单的代码就实现了:

  1.   @Test
  2. public void BimapTest(){
  3. BiMap<Integer,String> logfileMap = HashBiMap.create();
  4. logfileMap.put(1,"a.log");
  5. logfileMap.put(2,"b.log");
  6. logfileMap.put(3,"c.log");
  7. System.out.println("logfileMap:"+logfileMap);
  8. BiMap<String,Integer> filelogMap = logfileMap.inverse();
  9. System.out.println("filelogMap:"+filelogMap);
  10. }

  Bimap数据的强制唯一性

  在使用BiMap时,会要求Value的唯一性。如果value重复了则会抛出错误:java.lang.IllegalArgumentException,例如:

  1. @Test
  2. public void BimapTest(){
  3. BiMap<Integer,String> logfileMap = HashBiMap.create();
  4. logfileMap.put(1,"a.log");
  5. logfileMap.put(2,"b.log");
  6. logfileMap.put(3,"c.log");
  7. logfileMap.put(4,"d.log");
  8. logfileMap.put(5,"d.log");
  9. }

  logfileMap.put(5,"d.log") 会抛出java.lang.IllegalArgumentException: value already present: d.log的错误。如果我们确实需要插入重复的value值,那可以选择forcePut方法。但是我们需要注意的是前面的key也会被覆盖了。

  1. @Test
  2. public void BimapTest(){
  3. BiMap<Integer,String> logfileMap = HashBiMap.create();
  4. logfileMap.put(1,"a.log");
  5. logfileMap.put(2,"b.log");
  6. logfileMap.put(3,"c.log");
  7.  
  8. logfileMap.put(4,"d.log");
  9. logfileMap.forcePut(5,"d.log");
  10. System.out.println("logfileMap:"+logfileMap);
  11. }
  12.  
  13. 输出:
  14. logfileMap:{5=d.log, 3=c.log, 2=b.log, 1=a.log}

  理解inverse方法
  inverse方法会返回一个反转的BiMap,但是注意这个反转的map不是新的map对象,它实现了一种视图关联,这样你对于反转后的map的所有操作都会影响原先的map对象。例如:

  1. @Test
  2. public void BimapTest(){
  3. BiMap<Integer,String> logfileMap = HashBiMap.create();
  4. logfileMap.put(1,"a.log");
  5. logfileMap.put(2,"b.log");
  6. logfileMap.put(3,"c.log");
  7. System.out.println("logfileMap:"+logfileMap);
  8. BiMap<String,Integer> filelogMap = logfileMap.inverse();
  9. System.out.println("filelogMap:"+filelogMap);
  10.  
  11. logfileMap.put(4,"d.log");
  12.  
  13. System.out.println("logfileMap:"+logfileMap);
  14. System.out.println("filelogMap:"+filelogMap);
  15. }

  输出:

  1. logfileMap:{3=c.log, 2=b.log, 1=a.log}
  2. filelogMap:{c.log=3, b.log=2, a.log=1}
  3. logfileMap:{4=d.log, 3=c.log, 2=b.log, 1=a.log}
  4. filelogMap:{d.log=4, c.log=3, b.log=2, a.log=1}

  BiMap的实现类

  Key-Value Map Impl     Value-Key Map Impl     Corresponding BiMap
  HashMap                     HashMap                       HashBiMap
  ImmutableMap             ImmutableMap               ImmutableBiMap
  EnumMap                    EnumMap                      EnumBiMap
  EnumMap                    HashMap                       EnumHashBiMap

Guava学习笔记:Guava新增集合类型-Bimap的更多相关文章

  1. Guava新增集合类型-Bimap

    Guava新增集合类型-Bimap BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但 ...

  2. Python学习笔记:set集合类型所有方法汇总

    ################################################## 集合的作用是:# 1.获得两个集合之间某种关系的集合(比如求两个集合的交集)# 2.计算集合之间的 ...

  3. Guava学习笔记目录

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  4. Guava新增集合类型-Multiset

    Guava新增集合类型-Multiset Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口 ...

  5. Guava新增集合类型-Multimap

    Guava新增集合类型-Multimap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比 ...

  6. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  7. 004-guava 集合-新增集合类型-MultiSet, MultiMap, BiMap , Table, ClassToInstanceMap, RangeSe, RangeMap等

    一.概述 Guava引入了很多JDK没有的.但明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契 ...

  8. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...

  9. 学习笔记 07 --- JUC集合

    学习笔记 07 --- JUC集合 在讲JUC集合之前我们先总结一下Java的集合框架,主要包含Collection集合和Map类.Collection集合又能够划分为LIst和Set. 1. Lis ...

随机推荐

  1. Linux运维之道(大量经典案例、问题分析,运维案头书,红帽推荐)

    Linux运维之道(大量经典案例.问题分析,运维案头书,红帽推荐) 丁明一 编   ISBN 978-7-121-21877-4 2014年1月出版 定价:69.00元 448页 16开 编辑推荐 1 ...

  2. 百度面试题 字符串相似度 算法 similar_text 和页面相似度算法

    在百度的面试,简直就是花样求虐. 首先在面试官看简历的期间,除了一个自己定义字符串相似度,并且写出求相似度的算法. ...这个确实没听说过,php的similar_text函数也是闻所未闻的.之前看s ...

  3. IOS开发之控件篇UITabBarControllor第二章 - 遮掩TableView问题

    在IOS7.0以后UITabBar 里面放入一个UITableView会出现一个问题,Table会被TabBar掩盖了,当移动到最后一项的时候,永远看不到,如下面的例子,总共是99项,但是只能显示到9 ...

  4. gulp学习笔记4

    gulp系列学习笔记: 1.gulp学习笔记1 2.gulp学习笔记2 3.gulp学习笔记3 4.gulp学习笔记4 之前的任务都是单个的,比较简单.接下去我们开始引用多个插件,一次性把任务搞定,省 ...

  5. Microsoft Visual Studio正忙解决办法

    问题描述 前段时间用vs2015进行开发.出现如下问题,关闭vs进程重启vs还是无法解决. 如何解决 进入本地项目.vs文件夹 这个文件夹下有个.suo文件,删除该文件,用任务管理器杀掉vs的进程,重 ...

  6. Win10下PB停在欢迎窗口界面

    问题:Win10下不能打开PB12.5,PB12.6,一直停在欢迎窗口界面. 解决方法:把服务"Touch Keyboard and Handwriting Panel Service&qu ...

  7. C语言数组空间的初始化详解

    数组空间的初始化就是为每一个标签地址赋值.按照标签逐一处理.如果我们需要为每一个内存赋值,假如有一个int a[100];我们就需要用下标为100个int类型的空间赋值.这样的工作量是非常大的,我们就 ...

  8. CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

    最近在测试的过程中, 发现了SpringBoar的一个问题: SpringBoard[53] <Error>: CGContextTranslateCTM: invalid context ...

  9. 解析大型.NET ERP系统 20条数据库设计规范

    数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...

  10. Oracle如何实现从特定组合中随机读取值

    在这里,我们会用到DBMS_RANDOM包和CASE WHEN语句,思路如下: 一.利用DBMS_RANDOM.RANDOM函数随机生成数值,然后对数值进行取模,如果我们要在10个元素中随机读取的话, ...