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
fromsubstring
中的字符进行比较,然后增加两个索引以避免再出现两行,其中这两个是递增的。这可以分解为以下几点:
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;
}
}