¿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?


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}" }

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).


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


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
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.