我正在阅读一本有关Java的书,并遇到了以下源代码。
//This example demonstrates how to search multiple occurences of a search string
public class SearchString3 {
public static void main(String[] s) {
String str = "I am a student. I am preparing for OCPJP";
int fromIndex = 0;
while(str.indexOf("am", fromIndex) > -1) {
fromIndex = str.indexOf("am", fromIndex);
System.out.println("Substring \"am\" occrs at index: " + fromIndex);
fromIndex++;
}
}
}
我很困惑“ fromIndex”变量如何递增。看起来,虽然while循环中的代码仅运行两次,但它必须在字符串的整个长度上运行。该代码来自Sharma和Ganesh的 Oracle认证专业Java SE 7程序员考试1Z0-804和1Z0-805 的第207页。
fromIndex变量如何更新?似乎while循环只有两次才能成立。 while循环如何对字符串的每个字符执行?有谁知道如何添加一些代码来对此进行调试?抱歉,今天我的大脑无法正常工作,昨晚我没睡很多。
答案 0 :(得分:1)
如果您将循环更改为如下所示,那么它只会执行两次,因为计数器会打印出fromIndex = str.indexOf("am", fromIndex);
,从而将fromIndex变量设置为fromIndex++;
正在增加以确保它们不会陷入无限的检查循环中,并在找到点之后开始检查索引
String str = "I am a student. I am preparing for OCPJP";
int fromIndex = 0;
int counter = 0;
while(str.indexOf("am", fromIndex) > -1) {
System.out.println(++counter);
fromIndex = str.indexOf("am", fromIndex);
System.out.println("Substring \"am\" occrs at index: " + fromIndex);
fromIndex++;
}
输出:
1
Substring "am" occrs at index: 2
2
Substring "am" occrs at index: 18
答案 1 :(得分:1)
第一轮:
fromIndex = str.indexOf("am", fromIndex); // search from index 0, result is 2, I (a)m a student, character (a)
System.out.println("Substring \"am\" occrs at index: " + fromIndex); // print ---> Substring "am" occrs at index: 2
fromIndex++; // increment fromIndex to 3
第二轮:
fromIndex = str.indexOf("am", fromIndex); // search from index 3, I a(m) a student, character (m)
System.out.println("Substring \"am\" occrs at index: " + fromIndex); // print ---> Substring "am" occrs at index: 18
fromIndex++; // increment fromIndex to 19, I a(m) prepa, the m character
完成。
答案 2 :(得分:1)
fromIndex
仅在每次匹配时更新(并在每次匹配后增加一次)。它不会通过字符串的每个元素。
但是,indexOf
将在每次匹配之间搜索字符串,因此将对整个字符串进行求值,但是大部分求值将在indexOf
内部进行。
答案 3 :(得分:1)
让我们分解一下。
在 第一次迭代期间,
fromIndex = 0;
fromIndex = str.indexOf("am", fromIndex); -------------------> gives 2
;
indexOf()从fromIndex(here 0)
开始,它更新了fromIndex = 2
下一条语句fromIndex
加1,因此fromIndex = 3
第二个迭代
fromIndex = 3;
fromIndex = str.indexOf("am", fromIndex); -------------------> gives 18
;
indexOf()从fromIndex(here 3)
开始,它更新了fromIndex = 18
下一条语句fromIndex
加1,因此fromIndex = 19
第三次迭代
fromIndex = 19
while
条件这次失败了,因为位置am
后没有19
。
因此循环仅运行两次,而不是字符串的整个长度。