在hashmap中为key添加值

时间:2014-04-21 17:11:14

标签: java hashmap

我有自定义对象的散列图,每个用户都应该有很多值。我想出了如何创建地图并将一个值放入键,但需要帮助这样的检查(伪代码):

If key exists then add another value to key

else add key and value

我目前有:

        Map<String, custom> map = new HashMap<String, custom>();


        for(customp : data) {
            map.put(p.getUser(), p);
        }

输出:

user1 / package.class@1231412
user2 / package.class@12fwf3
user3 / package.class@dc238d

获取输出的代码:

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

需要:

user1 / package.custom@1231412, package.custom@vfee, package.custom@2riopj
user2 / package.custom@12fwf3, package.custom@cwfc3
user3 / package.custom@324rrf, package.custom@23d, package.custom@cvewff2

我最终将遍历地图以获取每个对象并使用它们,但是现在密钥一直在替换,所以我没有掌握所有信息。

2 个答案:

答案 0 :(得分:3)

您似乎必须使用Map<String, List<custom>>

对于每个密钥,检查映射是否已经存在,如果是这种情况,则将自定义添加到使用此密钥映射的列表中,否则创建新映射并添加它。

for(custom p : data) {
   List<custom> l = map.get(p.getUser());
   if(l == null){
       l = new ArrayList<>();
       map.put(p.getUser(), l);
   }
   l.add(p);
}

如果你正在使用Java 8,上面的逻辑可以简化为:

Map<String, List<custom>> map = data.stream()
                                    .collect(Collectors.groupingBy(custom::getUser));

最后,如果你熟悉番石榴文库(如果你不是我也不推荐你),那么看看Multimap课程,它是一个集合,而不是映射每个密钥多个值。

遵循命名惯例也很不错。

答案 1 :(得分:2)

Map只能包含一个键的值,而不能包含多个值。您必须使用Map<String, List<Custom>>,因此Map包含一个键的值列表。

将值添加到地图内的列表的代码:

Map<String, Custom> map = new HashMap<String, List<Custom>>();
for(Custom p : data) {
   List<Custom> list = map.get(p.getUser());
   if(list == null){
       list = new LinkedList<Custom>();
   }
   list.add(p);
   map.put(list);
}