Groovy Haritası üzerinden Döngü?


175

Groovy'de yapmaya çalıştığım çok basit bir görevim var ama işe yaramayacak gibi görünüyor. Sadece groovy bir harita nesnesi ile döngü ve anahtar ve değer çıktı çalışıyorum ama bu kod çalışmıyor.

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

Çıkışı şöyle görünmeye çalışıyorum:

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

Birisi lütfen bunun nasıl yapılacağını açıklayabilir mi?


Cevaplarda gördüğünüz gibi, sorun bir harita üzerinden yinelemenin size bir "Girişler" koleksiyonu vermesidir, size anahtarları vereceğini ve değerlere bakacağınızı varsayıyordunuz. Bunu bu şekilde yapmak istiyorsanız map.keySet () üzerinden yineleyin ve gerisi beklediğiniz gibi çalışır.
Bill K

Döngü için içindeki kodunuzda s.key& kullanırsanız çalışmalıdır s.value.
inblueswithu

Yanıtlar:


328

Bir kapatma ile oldukça basit:

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

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

2
Meraktan, bu Groovy dil belgelerinde nerede belgeleniyor ( sanmıyorum! )? Harika bir yeni bakış açısıyla merak ediyorum, bunu nasıl bildin?
smeeb

10
@smeeb: her şey iyi belgelenmiş, buraya bir göz atın: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
Jack

101

Alternatif forolarak, Groovy Dokümanlarında gösterildiği gibi bir döngü kullanabilirsiniz :

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

Bir kapatmanın foraksine bir döngü kullanmanın bir yararı, bir eachkapak içinde bir kırılma noktasına vuramadığınız için each(Netbeans kullanırken) daha kolay hata ayıklamadır .


GGTS 3.2 kullanıyorum ve kapaklarda rutin olarak kesme noktaları ayarlıyorum ("her" kapak dahil). Sorun, her şeyin üzerinden geçeceği için bir kapanışta adım atmak için F6'yı kullanmaktır. Teknik olarak, F5'e birkaç kez vurabilir ve sonunda oraya girebilirsiniz, ancak bir kırılma noktası daha hızlıdır.
Philip

Cevap güncellendi. Netbeans kullanıyorum ve Groovy / Grails hata ayıklama alt par.
ubiquibacon

4
Ayrıca for döngüsünü kırabilir ve içeri giremezsiniz .each.
Alexander Suraphel

1
@AlexanderSuraphel breakçıkmak için kullanamazsınız each, ancak kullanabilirsinizreturn
ubiquibacon

7
@ubiquibacon hayır yapamazsınız. returnbenzer continuedeğildir break.
Alexander Suraphel

20

For döngüsünü kullanırken, s değeri bir Map.Entry öğesidir, yani anahtarı s.key'den ve değeri s.value'dan alabilirsiniz


5
OP kodunun neden çalışmadığını açıkladığınız için teşekkür ederiz
dj18

15

Başka seçenek:

def map = ['a':1, 'b':2, 'c':3]
map.each{
  println it.key +" "+ it.value
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.