2010-10-06 16 views

risposta

11

Prova questo:

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 

alternativa:

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

Molto bello, sembra che 'transpose()' è equivalente a 'zip()' di python. Ora se solo esistesse un costruttore di mappe per un elenco di coppie. '[:]. putAll (pairs.collect {new MapEntry (it [0], it [1])})' funziona come one-liner, ma è più brutto di quanto vorrei. – ataylor

+0

@ataylor Guarda il mio post aggiornato per un altro modo di usare 'MapEntry' – NullUserException

+5

' [chiavi, valori] .transpose(). Inject ([:]) {map, it -> map << (it as MapEntry)} ' –

5

Non c'è nulla di costruito direttamente in Groovy, ma ci sono un certo numero di modi per risolvere facilmente, eccone uno:

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

C'è anche la funzione collectEntries in Groovy 1.8 (attualmente in beta)

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

Molto bella. In attesa di 1,8 ancora di più ora. – ataylor

+5

Puoi anche omettere la chiusura dell'identità: '[chiavi, valori] .transpose(). CollectEntries()' –

+0

@ Maxy-B sì, dal 1.8.5 :-) –

Problemi correlati