2010-10-06 55 views

回答

11

试试这个:

def keys = [1, 2, 3] 
def values = ['a', 'b', 'c'] 
def pairs = [keys, values].transpose() 

def map = [:] 
pairs.each{ k, v -> map[k] = v } 
println map 

或者:

def map = [:] 
pairs.each{ map << (it as MapEntry) } 
+1

非常好,它看起来像'transpose()'相当于python的'zip()'。现在,如果只有对于列表对的Map构造函数。 '[:]。putAll(pairs.collect {new MapEntry(it [0],it [1])})'作为一行内容,但比我想要的更丑。 – ataylor 2010-10-07 03:53:27

+0

@ataylor查看我更新的帖子,了解另一种使用'MapEntry'的方法 – NullUserException 2010-10-07 04:00:27

+5

'[keys,values] .transpose().injection([:]){map,it - > map <<(它作为MapEntry)}' – 2010-10-07 06:06:08

5

没有直接到常规建造任何东西,但也有许多方法可以轻松地解决这个问题,这里有一个:

def zip(keys, values) { 
    keys.inject([:]) { m, k -> m[k] = values[m.size()]; m } 
} 

def result = zip([1, 2, 3], ['a', 'b', 'c']) 
assert result == [1: 'a', 2: 'b', 3: 'c'] 
20

还有Groovy 1.8中的collectEntries函数(目前处于beta版)

def keys = [1, 2, 3] 
def values = ['a', 'b', 'c'] 
[keys,values].transpose().collectEntries { it } 
+0

非常好。现在期待1.8更多。 – ataylor 2010-10-07 16:55:18

+5

你甚至可以省略身份关闭:'[keys,values] .transpose()。collectEntries()' – 2013-08-21 18:59:27

+0

@ Maxy-B是的,因为1.8.5 :-) – 2013-08-21 19:02:32

相关问题