2017-02-14 56 views
3

舉例來說,如果我有一個整數,字符串地圖:如何反轉包含Set <Integer>的地圖?

Map<Integer, String> myMap = new HashMap<Integer, String>(); 

這張地圖將包含整數的鍵值和名字的值。
我想要做的是製作一張新地圖,它將從地圖中複製所有值(名稱),並將它們作爲新地圖的關鍵字。
現在我不能得到的棘手的部分是,我想新地圖的值是數字,但如果有多個數字對應於相同的名稱
我希望他們被保存在一個集合。新地圖 例子:

Map<String, Set<Integer>> returnMap = new TreeMap<String, Set<Integer>>(); 

所以,如果 「約翰」 對應1,2,3,4。我想新的地圖含有「約翰」的關鍵含1,2,3,4

+0

@AdrianShum你說得對,我現在明白了。由於每個鍵的定義都是唯一的,因此它們不能相互衝突。 –

回答

4

這不是棘手:)

Map<Integer, String> map = ... //Your map 
Map<String, Set<Integer>> reverseMap = new TreeMap<String, Set<Integer>>(); 

for(Map.Entry<Integer, String> entry : map.entrySet()) { 
    Integer key = entry.getKey(); 
    String value = entry.getValue(); 
    Set<Integer> set; 

    if(reverseMap.containsKey(value)) { 
     set = reverseMap.get(value); 
     set.add(key); 
    } else { 
     set = new HashSet<Integer>(); 
     set.add(key); 
     reverseMap.put(value, set); 
    } 
} 
+1

答案可以在幾個方面得到改進:1.將'set'變量拉出是沒有意義的。或者你if(contains){set = map.get(v);} else {set = new HashSet; map.put(v,set); } set.add(key);'或簡單地'if(contains){map.get(v).add(key);} else {set = new HashSet; ....}'。 2.如果OP使用Java8,更可取的方法是使用Map.compute() –

5

谷歌的Guava library有一個很好的Multimap類一組將鍵映射到多個值。如果你使用它,你可以利用一系列幫手方法:

SetMultimap<String, Integer> returnMap = 
    Multimaps.invertFrom(Multimaps.forMap(myMap), TreeMultimap.create());