通过哈希映射循环将同一个键值分组到一个> pair

问题描述:

我一直在努力想办法创建一个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

假设您创建一个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

而不是简单的Map使用Google Guava的Multimap

一个Multimap

...集合键映射到值,类似于地图,但其中每个键可以与多个值相关联。

这个概念当然也已在其他图书馆实施,番石榴只是我个人的偏好。

由于HashMap<Integer,Integer>无法存储与1,101,11中相同的密钥,因此您的实际情况无法工作。

您可以轻松开发自己的multimap,但最好的做法是使用已经为此开发的类,Apache Commons框架已为您准备好MultiValueMap<K,V>类。

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);