问题:
如何在汇总映射之间的公共键值的同时合并映射。
输入:
[a: 10, b:2, c:3]
[b:3, c:2, d:5]
Run Code Online (Sandbox Code Playgroud)
输出
[a:10, b:5, c:5, d:5]
Run Code Online (Sandbox Code Playgroud)
扩展问题:
如何通过对 2 个映射中公共键的值应用函数(闭包)来合并原始 2 个映射。IE。让用户指定要使用的功能,而不是简单地总结公共键的值。
例如:如果用户想使用“min”函数而不是求和,则可以指定 min [a:10, b:2, c:2, d:5]作为结果。
当键的映射值为空时,您可以将注入与 ?: 一起使用:
map1 = [a:10, b:2, c:3]
map2 = [b:3, c:2, d:5]
(map1.keySet() + map2.keySet())
.inject([:]) {m, k -> m[k] = (map1[k] ?: 0) + (map2[k] ?: 0); m }
Run Code Online (Sandbox Code Playgroud)
其评估为
[a:10, b:5, c:5, d:5]
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用 collectEntries (这种方式的闭包并不那么难看):
map1 = [a:10, b:2, c:3]
map2 = [b:3, c:2, d:5]
(map1.keySet() + map2.keySet())
.collectEntries {[(it) : (map1[it] ?: 0) + (map2[it] ?: 0)]}
Run Code Online (Sandbox Code Playgroud)
为了使这个通用,允许传入一个闭包。但是 collectEntries 已经允许这样做,您不会获得太多收益。
第一个可以通过以下方式完成:
/* Transform entries in map z by adding values of keys also present in zz
* Take any entries in map zz whose keys are not in z. Add the result.
*/
Map mergeMaps(Map z, Map zz){
Map y = z.inject([:]) { result, e -> zz.keySet().contains(e.key) ? result << [(e.key) : e.value + zz[e.key]] : result << e }
Map yy = zz.findAll { e -> !z.keySet().contains(e.key) }
y + yy
}
Run Code Online (Sandbox Code Playgroud)
现在让我们在 Groovy 控制台上使用它:
mergeMaps([a: 10, b:2, c:3], [b:3, c:2, d:5])
Result: [a:10, b:5, c:5, d:5]
Run Code Online (Sandbox Code Playgroud)
扩展问题(更通用)可以通过一点小小的调整来完成:
Map mergeMapsWith(Map z, Map zz, Closure cls){
Map y = z.inject([:]) { result, e -> zz.keySet().contains(e.key) ? result << [(e.key) : cls.call(e.value,zz[e.key])] : result << e }
Map yy = zz.findAll { e -> !z.keySet().contains(e.key) }
y + yy
}
Run Code Online (Sandbox Code Playgroud)
现在让我们在 Groovy 控制台上使用它:
mergeMapsWith([a: 10, b:2, c:3], [b:3, c:2, d:5]) { a, b -> Math.min(a,b)}
Result: [a:10, b:2, c:2, d:5]
Run Code Online (Sandbox Code Playgroud)
或者如果我们想与乘法合并:
mergeMapsWith([a: 10, b:2, c:3], [b:3, c:2, d:5]) { a, b -> a * b }
Result: [a:10, b:6, c:6, d:5]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8178 次 |
| 最近记录: |