2013-01-10 10 views
9

Wie funktioniert eine for-each-Schleife, wenn sie eine Methode entweder rekursiv oder eine andere Methode aufruft?Wie funktioniert eine For-Each-Schleife?

Beispiel:

for(String permutation : permute(remaining)) 
    { 

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

durch die Art der Methode permute in einem String aus und gibt einen Satz.

Vielen Dank.

+0

Warum Sie es nicht und Schritt codieren obwohl es in einem Debugger, wie Eclipse? – OldProgrammer

+0

Das hat nichts mit Rekursion zu tun, wie es gestellt wird. –

+0

oder verwenden Sie javap zum Zerlegen! – auselen

Antwort

9

Nach dem Java Language Specification für die enhanced for Anweisung, den Ausdruck:

for (FormalParameter : Expression) Statement 

wird wie folgt ausgeführt:

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

Somit ist die Expression (die Iterable vom Typ sein muss) nur hat seine iterator() Methode einmal aufgerufen.

+0

Vielen Dank, Mann. :) – user1965283

+0

@ user1965283: Willkommen bei SO. Bitte akzeptieren Sie die Antwort: http://stackoverflow.com/faq – Jayan

1

Foreach-Schleife funktioniert auf jeder Klasse, die die Iterable-Schnittstelle implementiert und ist nur Syntax Zucker für hasNext() und next() auf einem Iterator aufrufen. Gleicher Thread gleiche Schleife und die Funktion wird einmal aufgerufen.

+0

Vielen Dank für Ihre Antwort. :) – user1965283

3

Ruft es einmal auf, speichert das Ergebnis, tut foreach.

So:

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

Edit: Wenn diese rekursiv ist, macht es wirklich keinen Unterschied. Jede Rekursionsebene hat einfach ihren eigenen Geltungsbereich und damit eine eigene "temp" -Variable. Somit wird die Permutierungsfunktion auf die niedrigste Stufe rekursiv, und dann wird jede höhere Stufe ihre Schleife vollständig nacheinander durchlaufen.

+0

Vielen Dank dafür. :) – user1965283

+0

@ user1965283 Kein Problem, aber vergessen Sie nicht, Ihre bevorzugte Antwort zu akzeptieren (Die Ulmangt sein sollte, wie seine Antwort ist kühler als meins) – Jeff

1

In Ihrem Beispiel das Ergebnis permute(remaining) ausgewertet vor betritt man in der Schleife. Während die erweiterte for-Schleife eigentlich nichts anderes als syntaktischer Zucker für Iteratoren ist, folgt sie immer noch den gleichen Prinzipien wie andere Schleifen - sie muss eine Menge haben, mit der sie arbeiten kann, bevor sie etwas anderes tun kann.

Ein einfacheres Beispiel so etwas wie dies sei:

while(input.hasNext()) 

Das ist etwas, das man in Projekten sehen kann, die in einer unbestimmten Menge von Zeilen zu lesen. Der Ausdruck input.hasNext() muss zuerst ausgewertet werden, dann können Sie eine Schleife machen.

+0

Vielen Dank für Ihre Antwort. :) – user1965283

1

Wenn wir diesem Test

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

und decompile Test.class mit JAD kompilieren werden wir diese Javac ersetzt for-each mit diesem Code sehen

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