使用 while 循环、子字符串和 indexOf 的简单 Java 问题

Simple Java question using while loop, substring, and indexOf

我正在做一个学习 Java 的练习,我应该在其中编写一个方法来将单词“类别:”之后的所有项目打印到屏幕上。这是我的尝试:

public static void main(String[] args) {
    
    String str = "We have a large inventory of things in our warehouse falling in "
            + "the category:apperal and the slightly "
            + "more in demand category:makeup along with the category:furniture and _.";
    
    printCategories(str);

}

public static void printCategories(String passedString) {
    
    int startOfSubstring = passedString.indexOf(":") + 1;
    int endOfSubstring = passedString.indexOf(" ", startOfSubstring);
    String categories = passedString.substring(startOfSubstring,endOfSubstring);
    
    while(startOfSubstring > 0) {
        System.out.println(categories);
        startOfSubstring = passedString.indexOf((":") + 1, passedString.indexOf(categories));
        System.out.println(startOfSubstring);
        System.out.println(categories);
    }

}

所以程序应该打印:

有吸引力
化妆
家具

我的尝试是程序应该打印它找到起始索引为“:”和结束索引为“”的子字符串。然后它再次做同样的事情,只是从变量 str 的开头开始,这次它从找到的最后一个类别的开头开始。

一旦找不到更多的“:”,indexOf(startOfSubstring 的一部分)将 return -1 并且循环将终止。但是,在打印第一个类别后,它会保持 returning -1 并在找到下一个类别之前终止。

两行:

        System.out.println(startOfSubstring);
        System.out.println(categories);

确认在打印第一个类别后是returning -1,最后一行确认类别变量仍然定义为“apperal”。如果我注释掉这一行:

startOfSubstring = passedString.indexOf((":") + 1, passedString.indexOf(categories));

它 return 的 startOfSubstring 为 77。所以它与该行有关,并试图更改导致它 return 的 indexOf 方法中搜索位置的开始 - 1 过早,但我无法弄清楚为什么会这样。我花了最后几个小时试图弄清楚...

请帮忙:(

我已更正(在评论中)您设置 startOfSubstring 新值的位置

while(startOfSubstring > 0) { // better if you do startOfSubstring != -1 IMO
    System.out.println(categories);
    // this should be startOfSubstring = passedString.indexOf(":", startOfSubstring +1);
    startOfSubstring = passedString.indexOf((":") + 1, passedString.indexOf(categories)); 
    System.out.println(startOfSubstring);
    System.out.println(categories);
}

程序有几个问题:

  1. 您正在 passedString 中搜索 (":") + 1,这是字符串 ":1",可能不是您想要的。

  2. 您应该在循环内计算 endOfSubstringcategories

这可能接近您想要的:

public static void printCategories(String passedString) {
    
    int startOfSubstring = passedString.indexOf(":") + 1;
    
    while(startOfSubstring > 0) {
        int endOfSubstring = passedString.indexOf(" ", startOfSubstring);
        // If "category:whatever" can appear at the end of the string
        // without a space, adjust endOfSubstring here.
        String categories = passedString.substring(startOfSubstring, endOfSubstring);
        // Do something with categories here, maybe print it?
        // Find next ":" starting with end of category string.
        startOfSubstring = passedString.indexOf(":", endOfSubstring) + 1; 
    }

}