转换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 ] }