编译没有问题,但无论我是否有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");
}
}
答案 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
如果您比较searchMe
和substring
中位置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
这次我们将b
与b
进行了比较。由于它们是相同的,我们在substring
中没有更多字母来检查我们是否可以将foundIt
设置为true
并将test
设置为循环。
这就是结束。
如果您从代码中删除,则在检查substring
程序将匹配{{Look for a
之后,您会发现第一个与s
的第一个字母匹配的字符时,您会得到肯定答复。 1}} substring
上的第一个字母也是s
。
while循环用于迭代整个substring
,只有在匹配相应字符失败的情况下,我们才会向前搜索一个地方。如果我们忽略这个内部循环并迭代整个数据,我们可以忽略一些积极的结果,就像我们在aab
字符串中寻找aaab
的情况一样。看看
aaab
aab
^^
^
会匹配,但在我们之后,我们必须将a
与b
匹配,否则会失败。如果没有内部while循环,我们可能会从上次检查的位置开始另一场比赛,该位置将失败,这将是
aaab
aab
^
这次我们也找不到匹配的子字符串,所以我们跳过a*aab*
部分。