2013-01-10 36 views
9

प्रत्येक लूप के लिए एक विधि कहने पर कैसे काम करता है, या तो पुनरावर्ती या एक अलग विधि?प्रत्येक लूप के लिए कैसे काम करता है?

उदाहरण:

for(String permutation : permute(remaining)) 
    { 

     // Concatenate the first character with the permutations of the remaining chars 
     set.add(chars.charAt(i) + permutation); 
    } 

रास्ता विधि दूसरे स्थान पर रखना एक स्ट्रिंग में लेता है और एक सेट देता है के द्वारा।

धन्यवाद।

+0

क्यों आप इसे और कदम कोड नहीं है हालांकि यह एक डीबगर में, ग्रहण की तरह है? – OldProgrammer

+0

इसका पुनरावृत्ति के साथ कुछ भी नहीं है, जैसा कि देखा गया है। –

+0

या अलग करने के लिए जावप का उपयोग करें! – auselen

उत्तर

9

Java Language Specificationenhanced for बयान के लिए, अभिव्यक्ति के अनुसार:

for (FormalParameter : Expression) Statement 

के रूप में क्रियान्वित किया जाता है इस प्रकार है:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    VariableModifiersopt TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 

इस प्रकार, Expression (जो प्रकार Iterable का होना चाहिए) केवल अपने iterator() विधि एक बार बुलाया जाता है।

+0

धन्यवाद आदमी। :) – user1965283

+0

@ उपयोगकर्ता 1 9 65283: एसओ में आपका स्वागत है। कृपया उत्तर स्वीकार करें: http://stackoverflow.com/faq – Jayan

1

foreach पाश किसी भी वर्ग कि Iterable इंटरफ़ेस लागू करता है पर काम करता है, और एक Iterator पर hasNext() और next() फोन करने के लिए केवल वाक्यविन्यास चीनी है। वही धागा समान लूप और फ़ंक्शन को एक बार बुलाया जाता है।

+0

आपके उत्तर के लिए धन्यवाद। :) – user1965283

3

इसे एक बार कॉल करता है, परिणाम संग्रहीत करता है, foreach करता है।

इस तरह

:

Collection<String> temp = permute(remaining); 
for(String permutation : temp) { 
... 
} 

संपादित करें: यदि यह पुनरावर्ती है, यह वास्तव में कोई फर्क नहीं पड़ता। रिकर्सन की प्रत्येक परत में केवल अपना दायरा होता है, और इस प्रकार इसका अपना "अस्थायी" चर होता है। इस प्रकार परमिट फ़ंक्शन निम्नतम स्तर पर पुन: कार्य करेगा, फिर प्रत्येक उच्च स्तर पूरी तरह अलगforeach लूप को पूरी तरह से अलग करेगा।

+0

इसके लिए धन्यवाद। :) – user1965283

+0

@ user1965283 कोई समस्या नहीं है, लेकिन अपने पसंदीदा उत्तर को स्वीकार करना न भूलें (जो उलमंगट होना चाहिए, क्योंकि उसका जवाब मेरा से कूलर है) – Jeff

1

आपके उदाहरण में, का परिणाम का मूल्यांकन से पहले लूप में प्रवेश करता है। जबकि लूप के लिए बढ़ाया गया यह वास्तव में इटरेटर्स के लिए सिंटैक्टिक चीनी से ज्यादा कुछ नहीं है, फिर भी यह वही सिद्धांतों का पालन करता है जैसे अन्य लूप होगा - इसे किसी और चीज से पहले संचालित करने के लिए एक सेट होना चाहिए।

एक सरल उदाहरण कुछ इस तरह होगा:

while(input.hasNext()) 

कुछ आप परियोजनाओं है कि लाइनों तथा एक अनिश्चित अवधि में पढ़ा में देख सकते है कि। अभिव्यक्ति input.hasNext() का मूल्यांकन पहले किया जाना चाहिए, तो आप पाश कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। :) – user1965283

1

हम इस टेस्ट

class Test { 
    public static void main(String[] args) throws Exception { 
     Set<String> set = new HashSet<>(); 
     for (String s : set) { 
     } 
    } 
} 

JAD साथ संकलन और Test.class डिकंपाइल अगर हम कि javac इस कोड के साथ के लिए-प्रत्येक प्रतिस्थापित देखेंगे

Set set = new HashSet(); 
    String s; 
    for(Iterator iterator = set.iterator(); iterator.hasNext();) 
     s = (String)iterator.next();