6

我一直很难想出一种方法来创建一个 HashMap,它将具有相同键的值(到一个列表中)分组。这就是我的意思:

假设我有以下键和值:

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

我想将这些值放入

Hashmap <Integer, List<Integer>>

这样它将值分组到具有相同键的 List Integer 中,如下所示:

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

现在键和值存储在一个

Hashmap <Integer, Integer>

而且我不知道如何遍历这个 Hashmap 以使用键创建新的 Hashmap:值对列表。有没有人有这个话题的好方法?

4

4 回答 4

10

假设您创建了一个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);
于 2013-02-27T15:41:04.340 回答
8

而不是普通Map使用 Google Guava 的Multimap.

AMultimap是一个

...将键映射到值的集合,类似于 Map,但其中每个键可能与多个值相关联。

这个概念当然也已经在其他库中实现了,Guava 只是我个人的喜好。

于 2013-02-27T15:37:14.183 回答
1

HashMap 只会为每个 Integer 存储 1 个值。所以迭代它应该只给你以下值:

Key      Value 
1         12 
2         20 
3         31 

要遍历 Map 的内容,您可以使用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-27T15:46:28.423 回答
0

您的实际情况无法正常工作,因为 aHashMap<Integer,Integer>无法存储两对与 in 相同的 key1,101,11

您可以轻松开发自己的多地图,但最好的办法是使用已经为此开发的类,Apache Commons框架MultiValueMap<K,V>已经为您准备了一个类。

于 2013-02-27T15:38:13.870 回答