2013-08-19 4 views
0

컴파일에 문제는 없지만 while 루프가 있는지 여부에 관계없이 결과는 같습니다. while 루프가 포함 된 이유를 이해할 수 없습니다.다음 프로그램에서 while 루프의 목적은 무엇입니까?

public class ContinueWithLabelDemo { 

    public static void main(String[] args) { 

     String searchMe = "Look for a substring in me"; 
     String substring = "sub"; 
     boolean foundIt = false; 

     int max = searchMe.length() - substring.length(); 

     test: 
     for (int i = 0; i <= max; i++) { 
      int n = substring.length(); 
      int j = i; 
      int k = 0; 

      while (n-- != 0) { // WTF??? 
       if (searchMe.charAt(j++) != substring.charAt(k++)) { 
        continue test; 
       } 
      } 

      foundIt = true; 
      break test; 
     } 
     System.out.println(foundIt ? "Found it" : "Didn't find it"); 
    } 
} 
+3

'n'은'substring.length()'에서'0'으로 카운트 다운됩니다. – MadProgrammer

+0

@MadProgrammer는 일반적으로 yes이지만'continue test;'while은 쉽지 않습니다 ... – Pshemo

+0

@MadProgrammer Idol 그렇게 생각하면 b/c 그러면이 루프는 3 번만 실행되지만 하위 문자열이 발견 될 때까지 계속 진행됩니다. 또한 while 루프를 빼내면 (적절한 괄호 포함) 프로그램의 결과는 같습니다. 그들이 그것을 넣은 유효한 이유가 있어야합니다. – VisWebsoft

답변

4

당신은 당신이

while (n-- != 0) { // WTF??? 

이 예제가 어떻게 작동하는지

System.out.println("outside loop"); 
while (n-- != 0) { // WTF??? 
    System.out.println("inside loop: comparing " 
      + searchMe.charAt(j) + ":" + substring.charAt(k)); 

보고로 대체 할 수있다 : BTW,이 자바 SE 튜토리얼에서 불과 예제 프로그램입니다. 아래는 설명이 거의 없습니다.


이 코드는 searchMe 문자열에 substring을 찾고있다. 당신이 searchMe에 위치 0에서 문자를 비교하면

Look for a substring in me 
^ 
sub 

substring 당신은 그들이 같은 L 아니라는 것을 알 = s 그래서 우리는 문자의 나머지 부분을 일치 건너 뛸 수 있습니다 및 다음으로 이동 :이 예에서 살펴 보자! 위치 (즉, continue test;의 목적이다)

Look for a substring in me 
^ 
sub 

그래서 지금 우리가 substring의 첫 글자와 searchMe의 첫 번째 문자와 다음 문자를 비교하려고합니다. 우리가 o 얻을이 시간! = s 그래서 문자열이 곳에서 시작하는 것이 방법이 없습니다에 수행 할 수 있습니다.

몇 비교 후 우리는 마침내 약속 장소를 발견

substring의 첫 글자가 searchMe ( s == s)에서 현재 편지와 동일합니다 그래서 우리는 아직 while 루프에서 점프를 못해 및하려고합니다
Look for a substring in me 
     ^
      sub 

다음 편지를 확인하십시오. 그리고 우리는 우리가 다음 단계에서 일어날 수있는 우리의 전체 substring 반복 될 때까지, 그래서 우리는 우리의 루프를 계속

Look for a substring in me 
      ^
      sub 

== uu 때문에 또 다른 성공을 가지고있다.

Look for a substring in me 
      ^
      sub 

우리가 bb을 비교하여이 시간. 그들은 동등하고 우리는 substring에 더 많은 문자가 없기 때문에 foundIt의 값을 true으로 설정하고 루프를 위해 test을 제동 할 수 있습니다.

그리고 끝입니다.


당신이 substring에 첫 번째 문자로 s 일치합니다 Look for a 프로그램을 확인 후 귀하의 경우 substring의 첫 글자와 일치합니다 첫 번째 문자를 찾을 수 귀하의 코드에서 당신이 즉시 긍정적 인 반응을 얻을 것이다 동안 제거 할 경우 또한 s이됩니다.

while 루프는 여기에서 전체 substring을 반복하는 데 사용되며 일치하는 문자가 일치하지 않는 경우에만 한 위치 앞으로 이동합니다. 이 내부 루프를 무시하고 전체 데이터를 반복하면 aabaaab 문자열로 찾는 것과 같은 긍정적 인 결과를 무시할 수 있습니다.

aaab 
aab 
^^ 

^이 일치 봐 그러나 그 후 우리는 실패합니다 ba과 일치해야합니다. 마지막

aaab 
    aab 
^

우리가 a*aab* 부분을 생략 우리는 또한 그래서 하위 문자열에 대한 일치를 찾지 못했습니다이 시간이 될 것이다 실패 위치를 확인에서 내부 while 루프없이 우리는 아마 다른 경기를 시작합니다.