Java——雙向map BiMap

原文鏈接:https://vipcowrie.iteye.com/blog/1517338

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,很簡單。和其他集合的一樣,他也有很多的實現,

guava學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章