2013-01-10 5 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

왜 당신은 단계를 코딩하지 않는다 이클립스처럼 디버거에서도 그렇습니까? – 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 : 안녕하세요. 답변을 수락하십시오 : http://stackoverflow.com/faq – Jayan

1

Foreach 루프는 Iterable 인터페이스를 구현하는 모든 클래스에서 작동하며 Iterator에서 hasNext()next()을 호출하기위한 구문 설탕입니다. 동일한 스레드와 동일한 루프와 함수가 한 번 호출됩니다.

+0

답변 해 주셔서 감사합니다. :) – user1965283

3

한 번 호출하고 결과를 저장하며 foreach는 수행합니다. 이처럼

:

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

편집 :이 재귀 경우, 정말 차이가 없습니다. 재귀의 모든 계층에는 고유 한 범위와 자체 "임시 변수"가 있습니다. 따라서 permute 함수는 가장 낮은 레벨로 재발행되며, 각각의 상위 레벨은 을 완전히 분리하여foreach 루프를 연속적으로 수행합니다.

+0

고맙습니다. :) – user1965283

+0

@ user1965283 아무런 문제는 없지만 원하는 답변을 수락하는 것을 잊지 마십시오. (그의 대답은 내 것보다 시원합니다.) – Jeff

1

예에서 permute(remaining)의 결과는 으로 계산되고이 루프에 들어가기 전에 계산됩니다. 향상된 for 루프는 실제로 반복자에 대한 통사론적인 설탕이지만, 다른 루프와 동일한 원칙을 따르고 있습니다. 다른 작업을 수행하기 전에 먼저 작동해야합니다.

더 간단한 예를 들어 이런 식으로 뭔가 될 것이다 :

당신이 라인의 무한한 양 읽기 프로젝트에 볼 수 있습니다 뭔가의
while(input.hasNext()) 

. 표현식 input.hasNext()을 먼저 평가해야하고 루프 할 수 있습니다. 우리가 JAD와 Test.class라는를이 테스트를

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

를 컴파일하고 컴파일하면

+0

답장을 보내 주셔서 감사합니다. :) – user1965283

1

우리가이 코드에 대한-각 대체 그 javac의를 볼 수

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