2013-02-27 24 views
4

我一直在努力想辦法創建一個HashMap,它將組合值(到列表中)同樣的鑰匙。這就是我的意思是:通過哈希映射循環將同一個鍵值分組到一個<key,list <values>> pair

說我有以下鍵和值:

Value  Key *Sorry I got the columns swapped 
1   10 
1   11 
1   12 
2   20 
3   30 
3   31 

我想將這些值轉換爲

Hashmap <Integer, List<Integer>> 

,使其組值代入列表整數,其具有相同的密鑰,這樣的事情:

(1,{10,11,12}),(2,20 {}),(3,{30,31})

眼下鍵和值存儲在

Hashmap <Integer, Integer> 

而且我在如何遍歷此HashMap與鍵創建新的Hashmap丟失:值對的列表。有沒有人有這個主題的好方法?

+0

你確定這些值存儲在一個'地圖'? – 2013-02-27 15:35:58

+2

由於「HashMap」中的關鍵字是唯一的,我敢打賭你的大部分信息都會丟失。做一個簡單的'for(Map.Entry e:yourMap){out.println(e.getKey()+「」+ e.getValue()); }'循環來檢查當前地圖的內容。 – jlordo 2013-02-27 15:36:15

+0

地圖有唯一的密鑰。密鑰1是如何重複的? – JHS 2013-02-27 15:36:39

回答

6

假設您創建一個HashMap<Integer, List<Integer>>,並希望鍵值對添加到它,你問,你可以用下面的方法方式:

public void addToMap(HashMap<Integer, List<Integer>> map, Integer key, Integer value){ 
    if(!map.containsKey(key)){ 
    map.put(key, new ArrayList<>()); 
    } 
    map.get(key).add(value); 
} 

使用這種方法與你的示例數據:

HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>(); 
addToMap(map, 1, 10); 
addToMap(map, 1, 11); 
addToMap(map, 2, 20); 
addToMap(map, 3, 30); 
addToMap(map, 3, 31); 
+1

這很好!謝謝:) – user974047 2013-02-27 16:08:41

+1

map.contains(key)或map.containsKey(key) – 2015-10-30 12:37:22

7

而不是簡單的Map使用Google Guava的Multimap

一個Multimap

...集合鍵映射到值,類似於地圖,但其中每個鍵可以與多個值相關聯。

這個概念當然也已在其他圖書館實施,番石榴只是我個人的偏好。

0

由於HashMap<Integer,Integer>無法存儲與1,101,11中相同的密鑰,因此您的實際情況無法工作。

您可以輕鬆開發自己的multimap,但最好的做法是使用已經爲此開發的類,Apache Commons框架已爲您準備好MultiValueMap<K,V>類。

0

HashMap將只爲每個整數存儲1個值。所以遍歷它應該只給你以下值:

Key  Value 
1   12 
2   20 
3   31 

要通過地圖的內容重複,你可以使用的entrySet()方法:

for(Map.Entry<Integer, Integer> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + " = " + entry.getValue()); 
} 

,在地圖的名單,我建議這樣做:

List<Integer> list = map.get(key); 
if(list == null) { 
    list = new ArrayList<Integer>(); 
    map.put(key, list); 
} 
list.add(value); 
相關問題