Guava學習筆記:Guava新增集合類型-Bimap

BiMap提供了一種新的集合類型,它提供了key和value的雙向關聯的數據結構。
  一般狀況下,咱們在使用Java的Map時,每每是經過key來查找value的,可是若是出現下面一種場景的狀況,咱們就須要額外編寫一些代碼了。首先來看下面一種表示標識序號和文件名的map結構。java

複製代碼

@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了。spa

  Bimap對象

  Bimap使用很是的簡單,對於上面的這種使用場景,咱們能夠用很簡單的代碼就實現了:get

複製代碼

  @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數據的強制惟一性io

  在使用BiMap時,會要求Value的惟一性。若是value重複了則會拋出錯誤:java.lang.IllegalArgumentException,例如:file

複製代碼

@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對象。例如: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}
相關文章
相關標籤/搜索