Loop through Map in Groovy?

175

Saya memiliki tugas yang sangat sederhana yang saya coba lakukan di Groovy tetapi sepertinya tidak dapat membuatnya bekerja. Saya hanya mencoba untuk mengulang melalui objek peta di groovy dan mencetak kunci dan nilai tetapi kode ini tidak berfungsi.

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

Saya mencoba untuk mendapatkan output agar terlihat seperti ini:

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

Bisakah seseorang tolong jelaskan bagaimana melakukan ini ??

Kevin
sumber
Seperti yang Anda lihat dalam jawaban, masalahnya adalah bahwa iterasi di atas peta memberi Anda koleksi "Entri", Anda berasumsi itu akan memberi Anda kunci dan Anda akan mencari nilainya. Jika Anda ingin melakukannya dengan cara itu, lakukan iterate di atas map.keySet () dan sisanya akan berfungsi seperti yang Anda harapkan.
Bill K
Ini akan berfungsi jika Anda menggunakan s.key& s.valuedalam kode Anda di dalam untuk loop.
inblueswithu

Jawaban:

328

Cukup sederhana dengan penutupan:

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

map.each{ k, v -> println "${k}:${v}" }
Mendongkrak
sumber
2
Karena penasaran, di mana ini didokumentasikan dalam dokumen bahasa Groovy ( saya tidak berpikir itu! )? Saya kira saya bertanya-tanya, dari sudut pandang seorang pemula Groovy, Bagaimana Anda tahu ini?
smeeb
10
@smeeb: semuanya terdokumentasi dengan baik, lihat di sini: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
Jack
101

Atau Anda dapat menggunakan forloop seperti yang ditunjukkan di Groovy Docs :

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

Salah satu manfaat menggunakan forloop sebagai lawan eachpenutupan adalah debugging yang lebih mudah, karena Anda tidak dapat mencapai titik istirahat di dalam eachpenutupan (saat menggunakan Netbeans).

ubiquibacon
sumber
Saya menggunakan GGTS 3.2 dan secara rutin mengatur break point dalam penutupan (termasuk penutupan "masing-masing"). Masalahnya adalah menggunakan F6 untuk melangkah melalui penutupan, karena akan membahas semuanya. Secara teknis, Anda dapat menekan F5 beberapa kali dan akhirnya berakhir di sana, tetapi titik istirahat lebih cepat.
Philip
Jawaban yang diperbarui. Saya menggunakan Netbeans dan debugging Groovy / Grails di bawah standar.
ubiquibacon
4
Plus Anda bisa menembus untuk loop dan tidak dalam .each.
Alexander Suraphel
1
@AlexanderSuraphel Anda benar bahwa Anda tidak dapat menggunakan breakuntuk keluar each, tetapi Anda dapat menggunakanreturn
ubiquibacon
7
@ubiquibacon tidak, Anda tidak bisa. returnanalog dengan continuetidak break.
Alexander Suraphel
20

Saat menggunakan for for, nilai s adalah elemen Map.Entry, artinya Anda bisa mendapatkan kunci dari s.key dan nilai dari s.value

sbglasius
sumber
5
Terima kasih telah menjelaskan mengapa kode OP tidak bekerja
dj18
15

Pilihan lain:

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