面对挑战,提出一种有效的方法来合并两个Map的ArrayList。
地图如下:
{Username=User1, Role=Admin}
所以一个列表看起来像这样:
List1 = [{Username=User1, Role=Admin},{Username=User2, Role=Auditor}]
以此类推。
还有另一个列表:
List 2 = [{Username=User1, Role=Integrator},{Username=User2, Role=Manager}]
注意: :用户在不同列表中具有不同的角色。
我最终想要得到的是:
MergedList = [{Username=User1, Role=[Admin,Integrator]},{Username=User2, Role=[Auditor,Manager}]
另一个注意事项: :实际列表中有50,000张地图,每张地图有20个条目!只是想在这里保持简单。
下面是我尝试过的东西。但是失败了。
尝试了putAll
。
尝试过merge
。
尝试了我在另一篇文章中找到的内容
map2.forEach((k, v) -> map3.merge(k, v, String::concat));
答案 0 :(得分:1)
关于性能和海量数据,我建议您避免使用java-stream(尽管它本身非常快)和Map::merge
方法。
在这里,您必须坚持与JVM级别接近的结构,并且for-loops
是您的朋友,这是我所知道的最简单的方法,可能会起作用:
final Map<String, Set<String>> newMap = new HashMap<>();
for (Map<String, String> map: list) { // iterate the List<Map>
for (Entry<String, String> entry: map.entrySet()) { // iterate the entries
final String key = entry.getKey(); // get the entry's key
newMap.computeIfAbsent(key, k -> new HashSet<>()); // compute a new pair
newMap.get(key).add(entry.getValue()); // add a value in any case
}
}
Set
防止重复值。
此解决方案假定以下数据结构。轻微的变化很容易应用于上述解决方案。
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("User1", "Admin");
map1.put("User2", "Auditor");
Map<String, String> map2 = new HashMap<>();
map2.put("User1", "Integrator");
map2.put("User2", "Manager");
map2.put("User3", "Coffee machine");
list.add(map1);
list.add(map2);
答案 1 :(得分:1)
您可以使用Java Streams实现此目的:
words = document.xpath('//w:r', namespaces=document.nsmap)
这会将所有用户分组并收集他们的角色。
结果将是:
Map<String, List<String>> result = Stream.concat(users1.stream(), users2.stream())
.collect(Collectors.groupingBy(m -> m.get("Username"), Collectors.mapping(m -> m.get("Role"), Collectors.toList())));