如何在groovy中还原哈希映射键和值中的结果

时间:2018-08-24 13:23:26

标签: list groovy hashmap

从哈希表“ hash1”中,我无法以常规方式获得结果“ hash2”:

hash1 = [a:['a1','b1','c1'],b:['a1','b1','c1','d1']]

hash2 = [a1:['a','b'],b1:['a','b'],c1:['a','b'],d1:['b']]

可以请您帮忙吗?

莫里斯

2 个答案:

答案 0 :(得分:1)

您可以收集第一张地图的反向元组。然后根据第一个元素对它们进行分组并收集列表,或者只是缩小。例如:

def hash1 = [a:['a1','b1','c1'],b:['a1','b1','c1','d1']]

println(
    hash1.collectMany{ k, vs -> 
        vs.collect{ [it, k] } 
    }.inject([:].withDefault{[]}){ m, t -> 
        m[t[0]] << t[1]; m
    }
)
// => [a1:[a, b], b1:[a, b], c1:[a, b], d1:[b]]

答案 1 :(得分:1)

请注意,我在一个地图值中添加了重复项(a1),以展示如何消除重复项(如果有)。如果您仍想保留重复项,则只需从以下方法中删除.unique()

def map = [a:['a1','b1','c1','a1'],b:['a1','b1','c1','d1']]

map.inject([:].withDefault { [] }) { acc, key, val ->
  val.collect { (acc[it] << key).unique() }
  acc
}

// [a1:[a, b], b1:[a, b], c1:[a, b], d1:[b]]