BiMap是guava中一個有用的集合類型,很簡單,它就是一個雙向的映射。
反向轉換一個Map
一個普通的map是一個key/value
的集合,你可以使用key來查詢value,例如,我來創建一個字段: ·
Map<String,String> britishToAmerican = Maps.newHashMap();
britishToAmerican.put("aubergine","egglant");
britishToAmerican.put("courgette","zucchini");
britishToAmerican.put("jam","jelly");
但是如果你想根據美語找英語呢?你需要寫代碼轉換一下:
// Generic method to reverse map.
public <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;
}
這樣做能實現功能,但是有一些你要考慮的問題:
1)如何處理重複的value的情況,不考慮的話,那麼反轉的時候會覆蓋前面的值
2)如果我們需要在反轉的map中增加新的key呢?我們是否也需要在原始的map中更新一個值呢!這個實在太煩了
BiMap
這就是BiMap用武之地了,先看看怎麼使用它:
BiMap<String,String> britishToAmerican = HashBiMap.create();
// Initialise and use just like a normal map
britishToAmerican.put("aubergine","egglant");
britishToAmerican.put("courgette","zucchini");
britishToAmerican.put("jam","jelly");
System.out.println(britishToAmerican.get("aubergine")); // eggplant
BiMap<String,String> americanToBritish = britishToAmerican.inverse();
System.out.println(americanToBritish.get("eggplant")); // aubergine
System.out.println(americanToBritish.get("zucchini")); // courgette
很簡單啊,但是有些事情還需要你注意:
強制唯一性:
首先,BiMap強制其value的唯一性,如果發現違規則會拋出IllegalArgumentException。
britishToAmerican.put("pudding","dessert");
britishToAmerican.put("sweet","dessert"); // IllegalArgumentException.
如果你確實希望增加一個已經存在的值,那麼可以使用forcePut
方法覆蓋原有值。
britishToAmerican.put("pudding","dessert");
britishToAmerican.forcePut("sweet","dessert"); // Overwrites the previous entry
System.out.println(britishToAmerican.get("sweet")); // dessert
System.out.println(britishToAmerican.get("pudding")); // null
關於inverse方法
另外一個關鍵點就是理解inverse方法,這個方法返回一個反轉後的BiMap,即key/value互相切換的映射。
這個反轉的map並不是一個新的map,而是一個視圖,這意味着,你在這個反轉後的map中的任何增刪改操作都會影響原來的map
americanToBritish.put("potato chips","crisps");
System.out.println(britishToAmerican.containsKey("crisps")); // true
System.out.println(britishToAmerican.get("crisps")); // potato chips
這就是BiMap,很簡單。和其他集合的一樣,他也有很多的實現,