วนรอบแผนที่ใน Groovy หรือไม่


175

ฉันมีงานง่าย ๆ ที่ฉันพยายามทำใน Groovy แต่ดูเหมือนจะไม่สามารถใช้งานได้ ฉันแค่พยายามวนลูปผ่านวัตถุแผนที่เป็น Groovy และพิมพ์รหัสและค่าออกมา แต่รหัสนี้ใช้ไม่ได้

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

ฉันกำลังพยายามให้ได้ผลลัพธ์เช่นนี้:

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

ใครช่วยกรุณาอธิบายเกี่ยวกับวิธีการทำเช่นนี้ได้อย่างไร


ดังที่คุณเห็นในคำตอบปัญหาคือการวนซ้ำแผนที่ช่วยให้คุณได้รับ "รายการ" คุณคิดว่ามันจะให้กุญแจและคุณจะค้นหาค่า หากคุณต้องการที่จะทำเช่นนั้นซ้ำกว่า map.keySet () และส่วนที่เหลือจะทำงานตามที่คุณคาดหวัง
Bill K

มันควรจะทำงานถ้าคุณใช้s.key& s.valueในรหัสของคุณภายในสำหรับวง
inblueswithu

คำตอบ:


328

ค่อนข้างง่ายด้วยการปิด:

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

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

2
จากความอยากรู้เอกสารนี้อยู่ที่ไหนในเอกสารภาษา Groovy ( ฉันไม่คิดว่าเป็น! ) ฉันเดาว่าฉันสงสัยว่าจากมุมมองของมือใหม่ Groovy คุณรู้เรื่องนี้ได้อย่างไร
smeeb

10
@smeeb: เอกสารทุกอย่างดีลองดูที่นี่: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
แจ็ค

101

หรือคุณสามารถใช้การforวนซ้ำตามที่แสดงใน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
*/

ข้อดีอย่างหนึ่งของการใช้forลูปเมื่อเทียบกับการeachปิดคือการดีบักได้ง่ายขึ้นเนื่องจากคุณไม่สามารถกดจุดแตกในการeachปิด (เมื่อใช้ Netbeans)


ฉันใช้ GGTS 3.2 และกำหนดจุดพักเป็นประจำในการปิด (รวมถึงการปิด "แต่ละ") ปัญหาคือการใช้ F6 เพื่อก้าวผ่านการปิดเพราะมันจะไปทุกสิ่ง ในทางเทคนิคคุณสามารถกด F5 ได้หลายครั้งและในที่สุดก็ลงเอย แต่จุดพักเร็วกว่า
ฟิลิป

อัปเดตคำตอบ ฉันใช้ Netbeans และการดีบั๊กของ Groovy / Grails เป็นส่วนย่อย
ubiquibacon

4
.eachรวมทั้งคุณสามารถแบ่งออกสำหรับห่วงและไม่ได้อยู่ใน
Alexander Suraphel

1
@AlexanderSuraphel คุณถูกต้องที่คุณไม่สามารถใช้breakเพื่อออกeachแต่คุณสามารถใช้return
ubiquibacon

7
@ubiquibacon ไม่คุณไม่สามารถทำได้ returnจะคล้ายคลึงกับการไม่ได้continue break
Alexander Suraphel

20

เมื่อใช้ for for loop ค่าของ s คือองค์ประกอบ Map.Entry ซึ่งหมายความว่าคุณสามารถรับคีย์จาก s.key และค่าจาก s.value


5
ขอบคุณที่อธิบายว่าทำไมรหัสของ OP ถึงใช้งานไม่ได้
dj18

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.