我想转换一个包含值列表的HashMap,以产生与单个值的所有组合。
示例
hm = [x : [1,2], y : ['a','b'] ]
预期结果为
res = [ [x: 1, y : 'a'],
[x: 1, y : 'b'],
[x: 2, y : 'a'],
[x: 2, y : 'b']
]
到目前为止,我想出了这个方法
println hm.values().combinations().collect{[x:it[0],y:it[1]]}
[[x:1, y:a], [x:2, y:a], [x:1, y:b], [x:2, y:b]]
这是可行的,但取决于HashMap中的键的名称和数量,因此对于
hm = [u : [1,2], w : ['a','b'] , z : ['X','Y']]
我必须重写是为了
println hm.values().combinations().collect{[u:it[0],w:it[1],z:it[2]]}
对于所有的键名称和数字,有没有一个通用的解决方案?
发布于 2019-01-04 03:16:48
可以使用键的组合和值的组合:
def result = []
hm.entrySet().eachCombination { combination ->
combination.collect{it.value}
.eachCombination {
def entry = [:]
for(int i = 0; i < hm.size(); i++) {
entry.put(combination[i].key, it[i])
}
result << entry
}
println result
}
将所提供的输入的result
设置为[[x:1, y:a], [x:2, y:a], [x:1, y:b], [x:2, y:b]]
简单的逻辑是:找到键/值对的所有组合,然后对于每对键/值对,按原始键/值对的顺序组合值。
这在考虑到动态输入映射的情况下有效。
给定hm = [x : [1, 2], y : ['a', 'b'], z: ['e', 'f']]
,它将导致:
[[x:1, y:a, z:e],
[x:2, y:a, z:e],
[x:1, y:b, z:e],
[x:2, y:b, z:e],
[x:1, y:a, z:f],
[x:2, y:a, z:f],
[x:1, y:b, z:f],
[x:2, y:b, z:f]]
https://stackoverflow.com/questions/54027553
复制相似问题