2010-10-06 53 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

相關問題