给出三个列表:
l1 = ['Alice', 'Bob', 'Jane']
l2 = ['30', '40', '50']
l3 = ['NY', 'Berlin', 'Stockholm']
如何创建类似这样的内容:
[['name': 'Alice', 'age': '30', 'city': 'NY'],
['name': 'Bob', 'age': '40', 'city': 'Berlin'],
['name': 'Jane', 'age': '50', 'city': 'Stockholm']]
我尝试过[l1,l2,l3].transpose()
,但是它返回列表列表,我不知道如何向collectEntries()
添加适当的密钥
谢谢
编辑: 我想出的不太优雅的解决方案是:
assert l1.length == l2.length
assert l2.length == l3.length
def mapping = []
l1.eachWithIndex {name, index ->
def obj = [:]
obj.name = name
obj.age = l2[index]
obj.city = l3[index]
mapping += obj
obj = []
};
但是必须有更好的方法,对吧?
答案 0 :(得分:2)
尝试更优雅地解决这个问题。
以下代码:
def l1 = ['Alice', 'Bob', 'Jane']
def l2 = ['30', '40', '50']
def l3 = ['NY', 'Berlin', 'Stockholm']
def result = [l1, l2, l3].transpose().collect { a, b, c ->
[name: a, age: b, city: c]
}
println result
运行时,打印出:
~> groovy solution.groovy
[[name:Alice, age:30, city:NY],
[name:Bob, age:40, city:Berlin],
[name:Jane, age:50, city:Stockholm]]
~>
(添加格式以提高可读性)。
这里的技巧是问题已经提到的transpose method-[l1, l2, l3].transpose()
返回:
[[Alice, 30, NY], [Bob, 40, Berlin], [Jane, 50, Stockholm]]
和collect { a, b, c ->
表达式使用groovy解构将[Alice, 30, NY]
分配给a, b, c
等。这本质上是与以下相同的机制:
def (a, b, c) = [1, 2, 3]
用于多个作业。
collectEntries
返回一个地图,由于您想要最外层的列表,因此这里并不是真正的正确工具。