Groovy में मानचित्र के माध्यम से लूप?


175

मेरे पास एक बहुत ही सरल कार्य है जिसे मैं ग्रूवी में करने की कोशिश कर रहा हूं, लेकिन यह काम करने के लिए नहीं मिल सकता है। मैं सिर्फ ग्रूवी में एक मैप ऑब्जेक्ट के माध्यम से लूप करने की कोशिश कर रहा हूं और कुंजी और मूल्य प्रिंट करता हूं लेकिन यह कोड काम नहीं करता है।

// 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 () पर पुनरावृति करें और बाकी आपकी अपेक्षा के अनुरूप काम करेंगे।
बिल के

यह काम करना चाहिए यदि आप लूप के अंदर 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
जिज्ञासा से बाहर, यह ग्रूवी भाषा डॉक्स में कहां प्रलेखित है ( मुझे नहीं लगता कि यह है! )। मुझे लगता है कि मैं सोच रहा हूँ, एक ग्रूवी newbies के दृष्टिकोण से, आपको यह कैसे पता चला?
स्माइब

10
@smeeb: सब कुछ अच्छी तरह से प्रलेखित है, यहाँ एक नज़र डालें: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
जैक

101

वैकल्पिक रूप से आप एक forलूप का उपयोग कर सकते हैं जैसा कि ग्रूवी डॉक्स में दिखाया गया है :

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क्लोजर के अंदर एक ब्रेक प्वाइंट (नेटबीन्स का उपयोग करते समय) को हिट नहीं कर सकते हैं ।


मैं GGTS 3.2 का उपयोग करता हूं और नियमित रूप से क्लोजर ("प्रत्येक" क्लोजर सहित) में ब्रेक प्वाइंट सेट करता हूं। समस्या एफ 6 का उपयोग बंद करने के माध्यम से करने के लिए कर रही है, क्योंकि यह पूरी चीज पर जाएगी। तकनीकी रूप से, आप F5 को कई बार हिट कर सकते हैं और अंत में वहां समाप्त हो सकते हैं, लेकिन एक ब्रेक प्वाइंट तेज है।
फिलिप

अद्यतन उत्तर। मैं नेटबीन्स का उपयोग कर रहा हूं और इसके ग्रूवी / ग्रेल्स की डिबगिंग सब-बराबर है।
ubiquibacon

4
इसके अलावा आप एक लूप के लिए बाहर तोड़ सकते हैं और अंदर नहीं .each
अलेक्जेंडर सुरफेल

1
@AlexanderSuraphel आप सही हैं जिसे आप breakबाहर निकलने के लिए उपयोग नहीं कर सकते हैं each, लेकिन आप उपयोग कर सकते हैंreturn
ubiquibacon

7
@ubiquibacon नहीं आप नहीं कर सकते। नहीं के returnअनुरूप है । continuebreak
अलेक्जेंडर सुरफेल

20

लूप का उपयोग करते समय, s का मान Map.Entry तत्व है, जिसका अर्थ है कि आप s.key से कुंजी प्राप्त कर सकते हैं और s.value से मान प्राप्त कर सकते हैं।


5
यह समझाने के लिए धन्यवाद कि ओपी का कोड काम क्यों नहीं करता है
dj18

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.