我需要有人详细说明此代码的某些部分。
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) {
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test;
}
}
foundIt = true;
break test;
}
System.out.println(foundIt ? "Found it" : "Didn't find it");
}
}
更具体地说,我不明白这一部分:
int n = substring.length();
int j = i;
int k = 0;
while (n-- != 0) {
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test;
}
}
为什么有必要在这段代码中声明j和k?我知道if语句有一个原因
if (searchMe.charAt(j++) != substring.charAt(k++))
但我不明白代码在这部分实际上做了什么。
另外,
是什么while (n-- != 0)
意思?
答案 0 :(得分:1)
while (n-- != 0)
这只是循环,每次在循环周围减少n并在n(之前)减少1时结束n不是0.
int n = substring.length();
int j = i;
int k = 0;
while (n-- != 0) {
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test;
}
}
此代码以字符串中不同位置的j和k开头,然后通过比较该位置的String中的字符进行循环。 j ++只是说“使用j的当前值,然后再添加1”。
答案 1 :(得分:0)
以n >= 0
开头(字符串长度不能为负):
while (n-- != 0) {
...
}
只是
的替代品for (int t = n ; t > 0; t--) {
.... // use t instead of n, no change in your example
}
它只迭代n
次(子串的长度)。
答案 2 :(得分:0)
++
和--
是java中的preor或post incrementor和decrementor。
想象一下以下代码来理解行为:
int a = 42
System.out.println(a++) // prints 42
System.out.println(a) // prints 43
System.out.println(++a) // prints 44
System.out.println(a) // prints 44
实际上,它在处理语句之前或之后添加或减去1。
因此,在您的情况下,while (n-- != 0)
表示检查条件,其中n
不为零,之后递减1。
为了达到同样的目的,你也可以写:
while (n != 0) {
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test;
}
n = n - 1 // or n-- or n -= 1
}
您的第二个条件if (searchMe.charAt(j++) != substring.charAt(k++))
将j
中索引searchMe
处的字符与k
中索引substring
的字符进行比较,之后将两者都增加索引以避免再增加两行,其中这两行是递增的。
答案 3 :(得分:0)
这可以分解为以下内容:
outer: loop(/* for each character in searchMe to max */) {
loop(/* for each character in substring
* starting with current index in outer loop */) {
if(/* this substring does not match */)
continue /* with next outer loop iteration */;
}
/* if inner loop completed
* the substring did match at this index so break */;
}
在所有变量中,n
实际上是不需要的变量。我不知道为什么它会在那里,除了试图混淆。 while循环可以很容易地读取while(k < substring.length())
。
这种循环是必要的,因为要搜索子字符串,你必须从每个字符开始搜索:
Loo ook ok k f fo for or r a ... a s su sub <- found it
表达相同逻辑的另一种方法如下,但这会在每次迭代时创建一个新对象:
int max = searchMe.length() - substring.length();
for(int i = 0; i <= max; i++) {
String toTest = searchMe.substring(i, i + substring.length());
if(toTest.equals(substring)) {
foundIt = true;
break;
}
}
答案 4 :(得分:0)
嗯,这是一些有趣的代码。首先,break
上的标签是不必要的。
接下来,您的主要问题:
n--
是一个后缀递减运算符 - 计算n
的当前值,然后递减1.当下次评估n
时,它将具有价值n-1
。
在代码while(n-- != 0)
的上下文中暗示,当n == 1
时,此循环仍将执行,但下次我们看到n
时,我们将会查看0
而不是。
声明:
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test;
}
...表示如果主搜索字符串位置的值与我们要查找的值不匹配,我们需要立即跳转到标签test
。这允许您跳过后面两个语句的执行,并继续循环并查找正匹配。
j
始终设置为i
,但始终等于i
。如果找到了部分肯定匹配,则j
将通过围绕该语句的i
循环,比while
增加得快。
答案 5 :(得分:0)
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(); //the length of what we're going to search through, we
//subtract the substring.Length because if the 3rd to
//last character of searchMe is not equal to the first
//character of substring then searchMe can not contain substring.
test:
for (int i = 0; i <= max; i++) { //repeat until we pass the 3rd to last character of searchMe
int n = substring.length(); //resets n to the length of the substring
int j = i; //resets j to equal i so we search for the next letter in searchMe
int k = 0; //resets k to equal 0 so we search for the first letter in substring
while (n-- != 0) { //repeat this loop until n = 0, each pass will subtract 1 from
//n. this will loop a maximum of 3 times (the number of characters in substring)
if (searchMe.charAt(j++) != substring.charAt(k++)) {
//the if statement above will add 1 to j and add 1 to k after it checks to make sure the
//characters are not equal to each other. if they are equal then it will take the new
//j and k variables and repeat the while loop.
continue test; //if statement true then loop through the 'test' again.
}
}
foundIt = true;
break test;
}
System.out.println(foundIt ? "Found it" : "Didn't find it");
}
}
&#13;
答案 6 :(得分:0)
Oracle不知道如何在tutorial for beginners中编写简单的东西。
这部分:
int n = substring.length();
int j = i;
int k = 0;
while (n-- != 0) {
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test;
}
}
可以更改为:
int n = substring.length();
for (int k = 0; k < n; k++) {
if (searchMe.charAt(i + k) != substring.charAt(k)) {
continue test;
}
}
因此,您不需要j
而不是那个棘手的while
,您可以使用更直观的简单for
,因为它会遍历substring