BiMap提供了一種新的集合類型,它提供了key和value的雙向關聯的資料結構。
通常情況下,我們在使用Java的Map時,往往是透過key來找出value的,但是如果出現下面一種場景的情況,我們就需要額外寫一些程式碼了。首先來看下面一種表示識別序號和檔名的map結構。
[code] @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倒轉的方法來幫助實現倒置的映射關係。
[code] /** * 逆转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; }
[code] @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使用非常的簡單,對於上面的這種使用場景,我們可以用很簡單的程式碼就實現了:
[code] @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); }
[code] @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"); }
[code] @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對象。例如:
[code] @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); }
Key-Value Map Impl Value-Key Map Impl Corresponding BiMap
HashMap 4 〜〟 Map ImmutableBiMap
EnumMap EnumMap EnumBiMap
EnumMap HashMap EnumHashBiMap
就是以上是多列類庫-Guava-Bimap的內容,更多相關內容請關注PHP中文網(www.php.cn)!