在下面的程序中,while循环的目的是什么?

时间:2013-08-19 02:34:32

标签: java

编译没有问题,但无论我是否有while循环,结果都是一样的。我无法理解为什么包含while循环。顺便说一下,这只是Java SE教程中的一个示例程序:

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");
    }
}

1 个答案:

答案 0 :(得分: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));

了解此示例的工作原理。以下是一点解释。


此代码正在substring字符串中搜索searchMe。看一下这个例子:

Look for a substring in me
^
sub

如果您比较searchMesubstring中位置0的字符,您会发现它们不是L!= s,所以我们可以跳过匹配的其余部分字母并转到下一个位置(这是continue test;

的目的
Look for a substring in me
 ^
 sub

现在,我们将尝试将下一个字母与searchMe的第一个字母与第一个字母substring进行比较。这次我们得到o!= s所以没有办法在这个地方开始子串,让我们继续。

经过几次比较,我们终于找到了有希望的地方

Look for a substring in me
           ^
           sub

substring的第一个字母与searchMe s == s中的当前字母相同,所以我们不会从while循环跳转并会尝试检查下一封信。我们又取得了一次成功

Look for a substring in me
            ^
           sub

因为u == u,所以我们将继续循环,直到我们迭代整个substring,这可能会在下一步中发生。

Look for a substring in me
             ^
           sub

这次我们将bb进行了比较。由于它们是相同的,我们在substring中没有更多字母来检查我们是否可以将foundIt设置为true并将test设置为循环。

这就是结束。


如果您从代码中删除,则在检查substring程序将匹配{{Look for a之后,您会发现第一个与s的第一个字母匹配的字符时,您会得到肯定答复。 1}} substring上的第一个字母也是s

while循环用于迭代整个substring,只有在匹配相应字符失败的情况下,我们才会向前搜索一个地方。如果我们忽略这个内部循环并迭代整个数据,我们可以忽略一些积极的结果,就像我们在aab字符串中寻找aaab的情况一样。看看

aaab
aab
^^

^会匹配,但在我们之后,我们必须将ab匹配,否则会失败。如果没有内部while循环,我们可能会从上次检查的位置开始另一场比赛,该位置将失败,这将是

aaab
  aab
  ^

这次我们也找不到匹配的子字符串,所以我们跳过a*aab*部分。