首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Groovy中的值组合构建映射列表

从Groovy中的值组合构建映射列表
EN

Stack Overflow用户
提问于 2019-01-04 02:06:12
回答 1查看 607关注 0票数 1

我想转换一个包含值列表的HashMap,以产生与单个值的所有组合。

示例

代码语言:javascript
复制
hm = [x : [1,2], y : ['a','b'] ]

预期结果为

代码语言:javascript
复制
res = [ [x: 1, y : 'a'],
        [x: 1, y : 'b'],
        [x: 2, y : 'a'], 
        [x: 2, y : 'b']   
]

到目前为止,我想出了这个方法

代码语言:javascript
复制
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中的键的名称和数量,因此对于

代码语言:javascript
复制
hm = [u : [1,2], w : ['a','b'] , z : ['X','Y']]

我必须重写是为了

代码语言:javascript
复制
println hm.values().combinations().collect{[u:it[0],w:it[1],z:it[2]]}

对于所有的键名称和数字,有没有一个通用的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2019-01-04 03:16:48

可以使用键的组合和值的组合:

代码语言:javascript
复制
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']],它将导致:

代码语言:javascript
复制
[[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]]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54027553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档