2013-01-10 95 views
9

for-each循環如何以遞歸方式或其他方法調用方法時如何工作?for-each循環是如何工作的?

實施例:

for(String permutation : permute(remaining)) 
    { 

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

通過該方法置換需要在字符串並返回一組的方式。

謝謝。

+0

你爲什麼不編寫,並一步儘管它在調試器中,比如Eclipse? – OldProgrammer

+0

這與遞歸無關,正如所提出的那樣。 –

+0

或使用javap進行反彙編! – 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

@ user1965283:歡迎來到SO。請接受答案: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沒問題,但不要忘記接受你的首選答案(這應該是ulmangt的,因爲他的回答比我的更冷) – Jeff

1

在你的例子中,在之前,permute(remaining)的結果被評估爲,一個進入循環。雖然增強for循環實際上只不過是迭代器的語法糖,但它仍然遵循與其他循環相同的原則 - 它必須先設置一組才能在其他任何操作之前進行操作。

一個簡單的例子是這樣的:

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) { 
     } 
    } 
} 

和反編譯的Test.class與JAD我們會看到的javac取代了,每一個與此代碼

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