从多个列表创建地图列表

时间:2019-09-17 08:27:44

标签: groovy

给出三个列表:

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 = []
};

但是必须有更好的方法,对吧?

1 个答案:

答案 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返回一个地图,由于您想要最外层的列表,因此这里并不是真正的正确工具。