0

编译没有问题,但是无论我是否有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");
    }
}
4

1 回答 1

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

如果你比较位置 0 的字符,searchMesubstring会注意到它们不一样L!=s所以我们可以跳过匹配的其余字母并转到下一个位置(这就是 的目的continue test;

Look for a substring in me
 ^
 sub

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

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

Look for a substring in me
           ^
           sub

其中 of的第一个字母与( == )substring中的当前字母相同,因此我们不会从循环中跳转,而是会尝试检查下一个字母。我们又取得了成功searchMesswhile

Look for a substring in me
            ^
           sub

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

Look for a substring in me
             ^
           sub

而这一次我们bb. 由于它们是相等的,而且我们没有更多的字母substring来检查,我们可以设置foundItto的值true并为循环制动test

这就是结束。


substring如果您从代码中删除 while ,您将在检查Look for a程序将s与第一个字母匹配后发现第一个字符与您的情况下的第一个字母匹配时substring,您将立即得到肯定的响应s

此处使用 while 循环来遍历整个substring字符,并且只有在匹配相应字符失败的情况下,我们才会将搜索向前移动一个位置。如果我们忽略这个内部循环,只遍历整个数据,我们可以忽略一些积极的结果,比如我们aabaaabString 中查找的情况。看一看

aaab
aab
^^

^a将匹配,但在他们之后,我们将不得不匹配b哪个会失败。如果没有内部 while 循环,我们可能会从上次检查失败的位置开始另一个匹配,这将是

aaab
  aab
  ^

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

于 2013-08-19T03:05:14.383 回答