Karte in Groovy durchschleifen?


174

Ich habe eine sehr einfache Aufgabe, die ich in Groovy zu erledigen versuche, aber anscheinend nicht zum Laufen bringen kann. Ich versuche nur, ein Kartenobjekt in Groovy zu durchlaufen und den Schlüssel und den Wert auszudrucken, aber dieser Code funktioniert nicht.

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

Ich versuche, die Ausgabe so aussehen zu lassen:

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

Könnte jemand bitte näher erläutern, wie das geht?


Wie Sie in den Antworten gesehen haben, besteht das Problem darin, dass Sie beim Durchlaufen einer Karte eine Sammlung von "Einträgen" erhalten. Sie gingen davon aus, dass Sie die Schlüssel erhalten und die Werte nachschlagen würden. Wenn Sie dies auf diese Weise tun möchten, iterieren Sie über map.keySet (), und der Rest funktioniert wie erwartet.
Bill K

Es sollte funktionieren, wenn Sie s.key& s.valuein Ihrem Code innerhalb der for-Schleife verwenden.
Inblueswithu

Antworten:


326

Ganz einfach mit einem Verschluss:

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

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

2
Wo ist dies aus Neugier in den Dokumenten der Groovy-Sprache dokumentiert ( ich glaube nicht! )? Ich schätze, ich frage mich aus der Sicht eines Groovy-Neulings: Woher wusstest du das?
Smeeb

10
@smeeb: alles ist gut dokumentiert, schauen Sie hier: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
Jack

100

Alternativ können Sie eine forSchleife verwenden, wie in den Groovy Docs gezeigt :

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

Ein Vorteil der Verwendung einer forSchleife im Gegensatz zu einem eachAbschluss ist das einfachere Debuggen, da Sie keinen Haltepunkt innerhalb eines eachAbschlusses erreichen können (wenn Sie Netbeans verwenden).


Ich verwende GGTS 3.2 und setze routinemäßig Haltepunkte in Verschlüssen (einschließlich "jeder" Verschlüsse). Das Problem besteht darin, F6 zu verwenden, um einen Verschluss zu durchlaufen, da dies die ganze Sache durchläuft. Technisch gesehen können Sie F5 ein paar Mal drücken und schließlich dort landen, aber ein Haltepunkt ist schneller.
Philip

Antwort aktualisiert. Ich benutze Netbeans und das Debuggen von Groovy / Grails ist unterdurchschnittlich.
Ubiquibacon

4
Außerdem können Sie eine for-Schleife ausbrechen und nicht in .each.
Alexander Suraphel

1
@AlexanderSuraphel Sie sind richtig, dass Sie nicht breakzum Beenden verwenden können each, aber Sie können verwendenreturn
Ubiquibacon

7
@ubiquibacon nein du kannst nicht. returnist analog zu continuenicht break.
Alexander Suraphel

19

Bei Verwendung der for-Schleife ist der Wert von s ein Map.Entry-Element. Dies bedeutet, dass Sie den Schlüssel von s.key und den Wert von s.value abrufen können


5
Vielen Dank für die Erklärung, warum der Code des OP nicht funktioniert
dj18

14

Andere Option:

def map = ['a':1, 'b':2, 'c':3]
map.each{
  println it.key +" "+ it.value
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.