¿Recorrer el mapa en Groovy?

175

Tengo una tarea muy simple que estoy tratando de hacer en Groovy pero parece que no puedo hacer que funcione. Solo estoy tratando de recorrer un objeto de mapa en groovy e imprimir la clave y el valor, pero este código no funciona.

// 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]
}

Estoy tratando de que la salida se vea así:

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

¿Podría alguien explicar cómo hacer esto?

Kevin
fuente
Como has visto en las respuestas, el problema es que iterar sobre un mapa te da una colección de "Entradas", estabas asumiendo que te daría las claves y buscarías los valores. Si desea hacerlo de esa manera, itere sobre map.keySet () y el resto funcionará como esperaba.
Bill K
Debería funcionar si usa s.key& s.valueen su código dentro de loop.
inblueswithu

Respuestas:

328

Muy simple con un cierre:

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

map.each{ k, v -> println "${k}:${v}" }
Jack
fuente
2
Por curiosidad, ¿dónde está documentado esto en los documentos de Groovy Language ( no creo que lo sea )? Supongo que me pregunto, desde la perspectiva de los novatos Groovy, ¿Cómo sabías esto?
smeeb
10
@smeeb: todo está bien documentado, eche un vistazo aquí: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
Jack
101

Alternativamente, podría usar un forbucle como se muestra en los Documentos Groovy :

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
*/

Una ventaja de usar un forbucle en lugar de un eachcierre es una depuración más fácil, ya que no puede alcanzar un punto de ruptura dentro de un eachcierre (cuando se usa Netbeans).

ubiquibacon
fuente
Utilizo GGTS 3.2 y establezco rutinariamente puntos de ruptura en los cierres (incluidos los cierres "cada"). El problema es usar F6 para atravesar un cierre, ya que repasará todo. Técnicamente, puedes golpear F5 varias veces y eventualmente terminar allí, pero un punto de quiebre es más rápido.
Philip
Respuesta actualizada Estoy usando Netbeans y su depuración de Groovy / Grails es sub-par.
ubiquibacon
44
Además, puede romper un bucle for y no dentro .each.
Alexander Suraphel
1
@AlexanderSuraphel tiene razón, no puede usar breakpara salir each, pero puede usarreturn
ubiquibacon
77
@ubiquibacon no, no puedes. returnes análogo a continueno break.
Alexander Suraphel
20

Cuando se usa el bucle for, el valor de s es un elemento Map.Entry, lo que significa que puede obtener la clave de s.key y el valor de s.value

sbglasius
fuente
55
Gracias por explicar por qué el código del OP no funciona
dj18
15

Otra opción:

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