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

Java 需要帮助理解本课程的部分内容吗,java,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() -

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

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");
}
}
为什么有必要在代码中声明j和k?我知道if的声明是有原因的

if (searchMe.charAt(j++) != substring.charAt(k++))
但我不明白代码在这一部分实际上在做什么

还有,你认为呢

while (n-- != 0)
什么意思

这只是循环,在循环中每次将n减少1,并在n(之前)减少1不是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开始,然后循环比较该位置的字符串中的字符。j++只是说“使用j的当前值,然后再向其添加1”。

n>=0开始(字符串长度不能为负):

只是一个替代品

for (int t = n ; t > 0; t--) {
    .... // use t instead of n, no change in your example
}

它只迭代
n
次(子字符串的长度)。

++
--
是java中的前置或后置增量器和减量器

想象以下代码来理解行为:

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++)
searchMe
中索引
j
处的字符与索引
k
from
substring
中的字符进行比较,然后增加两个索引以避免再出现两行,其中这两个是递增的。

这可以分解为以下几点:

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

这种循环是必要的,因为要搜索子字符串,必须从每个字符开始搜索:

Loo ook ok k f fo for or r a ... a s su sub <- found it 厕所 注视 好啊 k f 法罗群岛 对于 或 r a ... a 苏
这是一些有趣的代码。首先,您的
break
上的标签是不必要的

接下来,请回答您的主要问题:

  • n--
    是后缀递减运算符-计算
    n
    的当前值,然后将其递减1。下一步计算
    n
    时,其值将为
    n-1

    在代码
    的上下文中,(n-!=0)
    意味着,当
    n==1
    时,此循环仍将执行,但下次看到
    n
    时,我们将改为查看
    0

  • 声明:

    if (searchMe.charAt(j++) != substring.charAt(k++)) {
        continue test;
    }
    
    …表示如果主搜索字符串位置的值与我们要查找的值不匹配,我们需要立即跳转到标签
    test
    。这允许您跳过后面两条语句的执行,继续循环并查找正匹配项

    j
    经常设置为
    i
    的值,但并不总是等于
    i
    。如果找到部分正匹配,则
    j
    的增量将比
    i
    快,因为
    循环该语句

class ContinueWithLabelDemo{
公共静态void main(字符串[]args){
String searchMe=“查找我的子字符串”;
字符串substring=“sub”;
布尔foundIt=false;
int max=searchMe.length()
substring.length();//我们要搜索的内容的长度
//减去子字符串.Length,因为如果第三个
//searchMe的最后一个字符不等于第一个字符
//子字符串的字符,则searchMe不能包含子字符串。
测试:

因为(inti=0;iOracle不知道如何用一个简单的语言编写简单的东西

本部分:

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;
    }
}
int n=substring.length();
对于(int k=0;k

因此,你不需要
j
,你可以用一个简单的
for
来代替那些棘手的
while
,这更直观,因为它迭代了
子字符串

我相信你知道Java中的--+和++是做什么的。但是你不知道
while
循环到底做了什么。我说得对吗?
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;
    }
}
if (searchMe.charAt(j++) != substring.charAt(k++)) {
    continue test;
}
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;
    }
}