} } }

    Guava进修笔记:Guava新增凑集类型-Bimap

    添加时间:2013-7-10 点击量:

      BiMap供给了一种新的凑集类型,它供给了key和value的双向接洽关系的数据布局。
      凡是景象下,我们在应用Java的Map时,往往是经由过程key来查找value的,然则若是呈现下面一种场景的景象,我们就须要额外编写一些代码了。起首来看下面一种默示标识序号和文件名的map布局。



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


      须要经由过程序号查找文件名,很简单。然则若是我们须要经由过程文件名查找其序号时,我们就不得不遍历map了。当然我们还可以编写一段Map倒转的办法来帮助实现倒置的映射关系。



        /
    
    逆转Map的key和value
    @param <S>
    @param <T>
    @param map
    @return
    /
    public static <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;
    }



        @Test
    
    public void logMapTest(){
    Map
    <Integer,String> logfileMap = Maps.newHashMap();
    logfileMap.put(
    1,a.log);
    logfileMap.put(
    2,b.log);
    logfileMap.put(
    3,c.log);

    System.out.println(
    logfileMap:+logfileMap);

    Map
    <String,Integer> logfileInverseMap = Maps.newHashMap();

    logfileInverseMap
    =getInverseMap(logfileMap);

    System.out.println(
    logfileInverseMap:+logfileInverseMap);
    }


      上方的代码可以帮助我们实现map倒转的请求,然则还有一些我们须要推敲的题目:
          1. 如何处理惩罚反复的value的景象。不推敲的话,反转的时辰就会呈现覆盖的景象.
          2. 若是在反转的map中增长一个新的key,倒转前的map是否须要更新一个值呢?
      在这种景象下须要推敲的营业以外的内容就增长了,编写的代码也变得不那么易读了。这时我们就可以推敲应用Guava中的BiMap了。


      Bimap


      Bimap应用很是的简单,对于上方的这种应用处景,我们可以用很简单的代码就实现了:



      @Test
    
    public void BimapTest(){
    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);
    }


      Bimap数据的强迫独一性


      在应用BiMap时,会请求Value的独一性。若是value反复了则会抛失足误:java.lang.IllegalArgumentException,例如:



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


      logfileMap.put(5,d.log) 会抛出java.lang.IllegalArgumentException: value already present: d.log的错误。若是我们确切须要插入反复的value值,那可以选择forcePut办法。然则我们须要重视的是前面的key也会被覆盖了。




        @Test
    
    public void BimapTest(){
    BiMap
    <Integer,String> logfileMap = HashBiMap.create();
    logfileMap.put(
    1,a.log);
    logfileMap.put(
    2,b.log);
    logfileMap.put(
    3,c.log);

    logfileMap.put(
    4,d.log);
    logfileMap.forcePut(
    5,d.log);
    System.out.println(
    logfileMap:+logfileMap);
    }

    输出:
    logfileMap:{
    5=d.log, 3=c.log, 2=b.log, 1=a.log}



      懂得inverse办法
      inverse办返回一个反转的BiMap,然则重视这个反转的map不是新的map对象,它实现了一种视图接洽关系,如许你对于反转后的map的所有操纵都邑影响本来的map对象。例如:



        @Test
    
    public void BimapTest(){
    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:{3=c.log, 2=b.log, 1=a.log}
    
    filelogMap:{c.log
    =3, b.log=2, a.log=1}
    logfileMap:{
    4=d.log, 3=c.log, 2=b.log, 1=a.log}
    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

    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: