我有自定义对象的散列图,每个用户都应该有很多值。我想出了如何创建地图并将一个值放入键,但需要帮助这样的检查(伪代码):
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
我最终将遍历地图以获取每个对象并使用它们,但是现在密钥一直在替换,所以我没有掌握所有信息。
答案 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);
}