2013-08-19 32 views
0

編譯沒有問題,但是不管是否有while循環,結果都是一樣的。我無法理解爲什麼包含while循環。順便說一句,這僅僅是從Java SE教程的示例程序:在下面的程序中,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通常是的,但'繼續測試;''裏面'while'使它不那麼容易... – Pshemo

+0

@MadProgrammer我不知道認爲是這樣,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)); 

,看看這個例子是如何工作的更換。下面是一些解釋。


此代碼在searchMe字符串中搜索substring。看看這個例子:

Look for a substring in me 
^ 
sub 

如果在searchMe比較在位置0的字符和substring你會發現,他們是不一樣的L = s所以我們可以跳過匹配的字母休息,去下!位置(即是continue test;目的)

Look for a substring in me 
^ 
sub 

所以,現在我們將嘗試一個字母比較與substring首字母searchMe第一個字母。這次我們得到o!= s所以沒有辦法在這個地方開始子串,讓我們繼續。

幾個比較之後,我們終於找到有前途的地方

Look for a substring in me 
     ^
      sub 

其中substring第一個字母是一樣searchMes == s)當前字母,所以我們從while循環慣於又跳,並會嘗試檢查下一封信。此外,我們還有另一個成功

Look for a substring in me 
      ^
      sub 

因爲u == u,因此我們將繼續我們的循環,直到我們遍歷我們整個substring可以在下一步發生。

Look for a substring in me 
      ^
      sub 

而這個時候我們比較bb。由於他們是平等的,我們沒有更多的字母在substring檢查我們可以設置值foundIttrue和制動test for循環。

而這就是結局。


如果您刪除,而從你的代碼,你會很快得到積極的迴應,你會發現第一個字符,將匹配在檢查Look for a程序後,在您的案件substring第一個字母將匹配ssubstring第一個字母這也將是s

While循環在這裏用來遍歷整個substring只有在匹配相應的字符,我們將繼續前進尋找一個地方失敗的情況。如果我們忽略這個內環,只是遍歷整個數據我們可以忽略像的情況下,我們會找aabaaab字符串一些積極成果。看看

aaab 
aab 
^^ 

^會一致,但在他們之後,我們將有權利匹配ab將失敗。如果沒有內循環的同時,我們可能會開始另一場比賽從去年檢查失敗位置,這將是

aaab 
    aab 
^

這一次,我們也沒能找到匹配的子串,所以我們跳過a*aab*一部分。