Groovy 沿途调换收集钥匙的地图

Groovy 沿途调换收集钥匙的地图,groovy,maps,transpose,Groovy,Maps,Transpose,我正在尝试转换地图,以便: [x: y, w: y, a: b] 变成 [y: [x, w], b: a] (所有变量都是字符串)执行以下操作 ["x": "y", "w": "y", "a": "b"].collectEntries { [it.value, it.key] } 在某种程度上让我明白了,但是在“y”的第一个新值上跺脚。我只得到:[y:w,b:a] 将新值存储到数组中以获取其公共新键的最佳方法是什么? 感谢您的帮助或建议。我希望这对您有所帮助: def map = ["x"

我正在尝试转换地图,以便:

[x: y, w: y, a: b]
变成

[y: [x, w], b: a]
(所有变量都是字符串)执行以下操作

["x": "y", "w": "y", "a": "b"].collectEntries { [it.value, it.key] }
在某种程度上让我明白了,但是在“y”的第一个新值上跺脚。我只得到:[y:w,b:a]

将新值存储到数组中以获取其公共新键的最佳方法是什么? 感谢您的帮助或建议。

我希望这对您有所帮助:

def map = ["x": "y", "w": "y", "a": "b"]

map.groupBy{ it.value }.collectEntries{ k, v -> [k, v.keySet()] }

我有一个类似的要求,但需要单独的键(类似于枢轴),因此我的解决方案有点不同:

def map = ["x": "y", "w": "y", "a": "b"]
def newKeys = map.collect{ it.value }.flatten() as Set
def transpose = newKeys.collectEntries{ [
    (it): map.findAll{ k, v -> v.contains(it) }.collect{ it.key } 
]}
println transpose
// [y:[x, w], b:[a]]