需要帮助理解本课程的部分内容

时间:2013-12-29 22:56:59

标签: java

我需要有人详细说明此代码的某些部分。

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)

意思?

7 个答案:

答案 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)

&#13;
&#13;
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;
&#13;
&#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