[英]Efficient way of mapping keys of first map to values of second map, where value of first maps are keys of second map
假设有 2 个映射,第一个映射的值是第二个映射的键,如下所示
Map1 { k1:[v1,v2,v3], k2:[v4,v5], k3:[v6,v7,v8] }
Map2 { v1:[a1,a2], v2:[a3,a4,a5], v3:[a6], v4:[a7,a8], v5:[a9,a10,a11], v6[a1,a3], v7[a1,a9], v8[a2,a4,a5] }
我想从上面的 2 张地图中制作一张地图,比如 Map3,这样
Map3 {
k1:[a1,a2,a3,a4,a5,a6],
k2:[a7,a8,a9,a10,a11],
k3:[a1,a2,a3,a4,a5,a9]
}
Java8 Collections API 中是否有任何内置方法,我可以使用它以有效的方式派生 Map3,而不是迭代这两个映射以使用旧的 Java5 方式获取 Map3。
替代解决方案是:
Map<String, List<String>> result =
map1.entrySet().stream()
.collect(HashMap::new, (m, e) -> m.merge(e.getKey(),
e.getValue().stream().flatMap(k -> map2.get(k).stream()).collect(toList()),
(l1, l2) -> { l1.addAll(l2);return l1; }),
Map::putAll);
这是使用流的解决方案:
return map1.entrySet().stream().collect(
Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream()
.map(map2::get)
.flatMap(List::stream)
.distinct()
.collect(Collectors.toList())));
输出:
{k1=[a1, a2, a3, a4, a5, a6],
k2=[a7, a8, a9, a10, a11],
k3=[a1, a3, a9, a2, a4, a5]}
您可以添加.sorted()
后.distinct()
如果你想k3
列表是为了。
我会像这样接近它。
在您的示例中,假设类型都是 String,请这样称呼它。
Map<String,Set<String>> map3 = reMap(map1,map2);
public static <K, V, R> Map<K, Set<R>> reMap(
Map<K, List<V>> map1, Map<V, List<R>> map2) {
Map<K, Set<R>> map3 = new HashMap<>();
for (Map.Entry<K, List<V>> e : map1.entrySet()) {
for (V map2key : e.getValue()) {
map3.compute(e.getKey(),
(k, v) -> v == null
? new HashSet<>()
: v)
.addAll(map2.get(map2key));
}
}
return map3;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.