此循环计算字符串中子字符串的出现次数,如何?

时间:2014-08-06 04:37:55

标签: java loops

public static int keywordCount (String str, String substr) {
    int count = 0;
    int i = 0;
    while ((str.indexOf(substr, i)) != -1) {
          count++;
          i += substr.length();
    }
    System.out.println(count);

    return count;
}

这是我老师的示例循环示例。我真的需要一些解释来理解这个循环是如何工作的?

提前致谢。

3 个答案:

答案 0 :(得分:1)

它使用String#indexOf(String, int)方法,该方法在Javadoc中定义为

  

从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。 ...如果不存在这样的k值,则返回-1。

请注意i是索引(因此i += substr.length();表示它将向前移动匹配的长度)。当没有更多匹配时,方法返回-1并结束循环。另外,我想这个

while ((str.indexOf(substr, i)) != -1)

应该是

while ((i = str.indexOf(substr, i)) != -1)

然后我相信逻辑是正确的。或者,

i = substr.length() + str.indexOf(substr, i);

答案 1 :(得分:1)

您不需要循环,因此无需理解。

您还需要一些具有良好方法的少量代码:

public static int keywordCount(String str, String substr) {
    return str.replace(substr, substr + "x").length() - str.length();
}

简约是优雅的核心。

答案 2 :(得分:0)

这里str.indexOf(substr,i)其中i是fromindex,它将返回你的子串的第一次出现的索引。如果你想要下一个子串的出现,那么会将fromindex设置为一个值,该值将是前一次迭代中找到的子串长度索引和前一个子串的索引。 我认为你的功能不会正常工作。它应该像

   public static int keywordCount( String str, String substr){
        int count = 0;
        int i = 0;
        while ((i=str.indexOf(substr, i)) != -1) {
            count++;
            i += substr.length();
        }
        System.out.println(count);
        return count;
    }