简单的While循环困惑-藏在桌子底下

时间:2018-08-27 16:30:05

标签: java string while-loop

我正在阅读一本有关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循环如何对字符串的每个字符执行?有谁知道如何添加一些代码来对此进行调试?抱歉,今天我的大脑无法正常工作,昨晚我没睡很多。

4 个答案:

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

因此循环仅运行两次,而不是字符串的整个长度。