2012-04-05 19 views
130

Ho un compito molto semplice che sto cercando di fare in Groovy ma non riesco a farlo funzionare. Sto solo cercando di scorrere un oggetto della mappa in groovy e stampare la chiave e il valore ma questo codice non funziona.Passa attraverso la mappa in Groovy?

// A simple map 
def map = [ 
     iPhone : 'iWebOS', 
     Android: '2.3.3', 
     Nokia : 'Symbian', 
     Windows: 'WM8' 
] 

// Print the values 
for (s in map) { 
    println s + ": " + map[s] 
} 

Sto cercando di ottenere l'output a guardare come questo:

iPhone: iWebOS 
Android: 2.3.3 
Nokia: Symbian 
Windows: WM8 

Qualcuno potrebbe elaborare su come fare questo ??

+0

Come avete visto nelle risposte, il problema è che l'iterazione di una mappa ti dà una raccolta di "voci", è stato ammesso che avrebbe dato le chiavi e si dovrebbe cercare i valori. Se si voleva fare in questo modo, iterare su map.keySet() e il resto funzionerà come previsto. –

+0

Dovrebbe funzionare se si utilizza 's.key' e' s.value' nel proprio codice all'interno di loop. – inblueswithu

risposta

249

Abbastanza semplice con una chiusura:

def map = [ 
      'iPhone':'iWebOS', 
      'Android':'2.3.3', 
      'Nokia':'Symbian', 
      'Windows':'WM8' 
      ] 

map.each{ k, v -> println "${k}:${v}" } 
+1

Per curiosità, dove è documentato nei documenti in lingua Groovy (** non credo che lo sia! **)? Immagino che mi stia chiedendo, dal punto di vista dei neofiti di Groovy, * Come lo sapevi? * – smeeb

+5

@smeeb: tutto è ben documentato, dai uno sguardo qui: http://www.groovy-lang.org/groovy- dev-kit.html # _iterating_on_maps – Jack

13

Quando si utilizza il ciclo for, il valore di s è un elemento Map.Entry, il che significa che è possibile ottenere la chiave dal s.key e il valore da s .value

+0

Grazie per aver spiegato * perché * il codice dell'OP non funziona – dj18

74

in alternativa è possibile utilizzare un ciclo for come mostrato nella Groovy Docs:

def map = ['a':1, 'b':2, 'c':3] 
for (e in map) { 
    print "key = ${e.key}, value = ${e.value}" 
} 

/* 
Result: 
key = a, value = 1 
key = b, value = 2 
key = c, value = 3 
*/ 

un vantaggio di utilizzare un ciclo for al contrario di una chiusura each è più facile il debug, in quanto non è possibile raggiungere un punto di interruzione all'interno di una chiusura each (quando si utilizza Netbeans).

+0

Io uso GGTS 3.2 e ho impostato regolarmente i punti di interruzione nelle chiusure (incluse le chiusure "ciascuna"). Il problema è usare F6 per passare attraverso una chiusura, poiché andrà a finire il tutto. Tecnicamente, puoi colpire F5 un sacco di volte e alla fine finire lì, ma un punto di interruzione è più veloce. – Philip

+0

Risposta aggiornata. Sto usando Netbeans e il suo debugging di Groovy/Grails è sotto-par. – ubiquibacon

+1

Inoltre puoi scoppiare un ciclo for e non in '.each'. –

10

Un'altra opzione:

def map = ['a':1, 'b':2, 'c':3] 
map.each{ 
    println it.key +" "+ it.value 
} 
Problemi correlati