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?

Kevin
quelle
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}" }
Jack
quelle
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).

Ubiquibacon
quelle
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

sbglasius
quelle
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
}
Pablo Pazos
quelle