有效合并两个地图的ArrayList

时间:2019-04-27 22:23:44

标签: java performance dictionary merge hashmap

面对挑战,提出一种有效的方法来合并两个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));

2 个答案:

答案 0 :(得分:1)

关于性能和海量数据,我建议您避免使用(尽管它本身非常快)和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())));