通过哈希映射循环将同一个键值分组到一个> 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丢失:值对的列表。有没有人有这个主题的好方法?
假设您创建一个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);
这很好!谢谢:) – user974047 2013-02-27 16:08:41
map.contains(key)或map.containsKey(key) – 2015-10-30 12:37:22
而不是简单的Map
使用Google Guava的Multimap
。
一个Multimap
是
...集合键映射到值,类似于地图,但其中每个键可以与多个值相关联。
这个概念当然也已在其他图书馆实施,番石榴只是我个人的偏好。
由于HashMap<Integer,Integer>
无法存储与1,10
和1,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);
你确定这些值存储在一个'地图'? – 2013-02-27 15:35:58
由于“HashMap”中的关键字是唯一的,我敢打赌你的大部分信息都会丢失。做一个简单的'for(Map.Entry e:yourMap){out.println(e.getKey()+“”+ e.getValue()); }'循环来检查当前地图的内容。 –
jlordo
2013-02-27 15:36:15
地图有唯一的密钥。密钥1是如何重复的? – JHS 2013-02-27 15:36:39