Ripeti la mappa in Groovy?


175

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

// 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 in questo modo:

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

Qualcuno potrebbe per favore approfondire su come fare questo ??


Come hai visto nelle risposte, il problema è che iterando su una mappa ti dà una raccolta di "Entries", stavi assumendo che ti avrebbe dato le chiavi e che avresti cercato i valori. Se si desidera farlo in questo modo, scorrere su map.keySet () e il resto funzionerà come previsto.
Bill K,

Dovrebbe funzionare se usi s.key& s.valuenel tuo codice all'interno per loop.
entro il

Risposte:


328

Abbastanza semplice con una chiusura:

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

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

2
Per curiosità, dove è documentato nei documenti del linguaggio Groovy ( non credo che sia! )? Immagino di chiedermi, dal punto di vista dei neofiti di Groovy, come lo sapevi?
smeeb

10
@smeeb: tutto è ben documentato, dai un'occhiata qui: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
Jack

101

In alternativa puoi usare un forloop come mostrato in 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 dell'utilizzo di un forciclo invece di una eachchiusura è il debug più semplice, poiché non è possibile raggiungere un punto di interruzione all'interno di una eachchiusura (quando si utilizzano Netbeans).


Uso GGTS 3.2 e stabilisco regolarmente punti di interruzione nelle chiusure (comprese le chiusure "ogni"). Il problema sta usando F6 per passare attraverso una chiusura, poiché andrà su tutto. Tecnicamente, puoi colpire F5 un sacco di volte e alla fine finire lì, ma un punto di interruzione è più veloce.
Filippo,

Risposta aggiornata. Sto usando Netbeans e il suo debug di Groovy / Grails è scadente.
ubiquibacon,

4
Inoltre puoi aprire un ciclo for e non entrare .each.
Alexander Suraphel,

1
@AlexanderSuraphel hai ragione che non puoi usare breakper uscire each, ma puoi usarereturn
ubiquibacon

7
@ubiquibacon no non puoi. returnè analogo a continuenon break.
Alexander Suraphel,

20

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


5
Grazie per aver spiegato perché il codice OP non funziona
dj18

15

Un'altra opzione:

def map = ['a':1, 'b':2, 'c':3]
map.each{
  println it.key +" "+ it.value
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.