转换Groovy映射
这是我的地图转换Groovy映射,groovy,Groovy,这是我的地图 [a: 1, b: 1, c: 2, d: 2, e: 1, f: 2] 我想将类似的值分组并获得: [1: [a, b, e], 2: [c, d, f]] 我最大的努力是 myMap.groupBy{it.value}.collectEntries{key, value -> [(key): value.keySet()]} 任何Groovier的代码?以下代码: def result = [a: 1, b: 1, c: 2, d: 2, e: 1, f: 2].i
[a: 1, b: 1, c: 2, d: 2, e: 1, f: 2]
我想将类似的值分组并获得:
[1: [a, b, e], 2: [c, d, f]]
我最大的努力是
myMap.groupBy{it.value}.collectEntries{key, value -> [(key): value.keySet()]}
任何Groovier的代码?以下代码:
def result = [a: 1, b: 1, c: 2, d: 2, e: 1, f: 2].inject([:].withDefault {[]}) { a, k, v ->
a[v] << k
a
}
println result
这使用了groovy方法(类似于其他语言中的foldLeft或reduce)和groovy方法,因此当您访问映射而找不到键时,将返回默认值空列表([]
)
说明:
-一次遍历一个键值对映射.inject(
-从一个空映射开始,如果您访问一个不存在的密钥,该映射将返回一个空列表[:].withDefault{[]}
对于每个键值对,使用初始映射){a,k,v-
a
在下一次迭代中a[v]
map.groupBy { it.value }.collectEntries { [it.key, it.value*.key ] }
获得相同的结果。您已经拥有的已经是简单而优雅的了?您仍然可以将其细化为
map.groupBy{it.value}.collectEntries{[it.key,it.value*.key]}
以获得相同的结果。
map.groupBy { it.value }.collectEntries { [it.key, it.value*.key ] }