字符串长度和字符串子字符串方法之间的相关性是什么?

时间:2013-12-03 00:53:46

标签: java string

我基本上必须创建一个程序,它返回字符串“code”出现在给定字符串中的任何位置的次数,除了我们接受任何字母“d”,所以“cope”和“cooe”计算我的APCS类,除了for循环的参数,特别是i<str.length()-3之外,我对代码没有任何问题。它工作正常,但只是在我从长度中任意减去随机数之后。我真的想知道它和其他代码之间的相关性是什么,所以它不仅仅是猜测和检查我的事情。我不想养成这样做的习惯。

public int countCode(String str) {
  int times = 0;
  for(int i =0;i<str.length()-3;i++){
  if(str.substring(i,i+2).equals("co") && str.substring(i+3,i+4).equals("e"))
      times++;
  }
  return times;
}

4 个答案:

答案 0 :(得分:3)

相关性是子字符串必须适合源字符串。您正在呼叫str.substring(i, i+2)。现在让我们说你的字符串是5个字符长。这意味着字符串中的第一个索引是0,最后一个索引是4.现在假设i等于3。

当您致电substring(i, i+2)时,您实际上正在呼叫substring(3, 5)substring方法采用起始索引和结束索引。你的结束索引结果是5,这是非法的,因为它在最后一个索引为4的字符串之外。

因此,您应该真正检查i < str.length() - searchString.length() + 1而不是i < str.length() - 3

答案 1 :(得分:2)

您的搜索模式长度为4个字符。字符串的最后一个字符位于索引.length() - 1。因此,模式可以开始的最后一个索引是.length() - 4之前的3个字符。您使用的值少于.length - 3。所以循环的最后一次迭代就是这个值。这是对的。

在这样的情况下,一个小草图可以提供帮助:

                |  0  |  1  |  2  |  3  |  Pattern
      ... | L-5 | L-4 | L-3 | L-2 | L-1 |  String (L==str.length)
         ... < L-3 ...|                    Iterations

答案 2 :(得分:1)

这实际上是一个正则表达式匹配。对于这种情况,使用String#substring不必要地复杂化。更好的方法是使用Pattern#matcher,如下所示:

public static int countCode(String s) {
    Pattern codepattern = Pattern.compile("co.e");
    Matcher codematcher = codepattern.matcher(s);
    int count = 0;
    while (codematcher.find()) count++;
    return count;
}

如您所见,find()将继续查找正则表达式,直到给定字符串结束。例如,给定String s = "This core supports all the code. Everyone comes to the core, for the cool stuff is all coded in here.";,上述方法返回5

编辑:我意识到这并不是你所要求的,但我认为这可能对你有所帮助。

答案 3 :(得分:0)

Gene是现货,但请考虑这种基于正则表达式的替代方案:

int times = str.replaceAll("co[a-z]e", "xxxxx").length() - str.length();

这一切都在一行中完成,你让正则表达式引擎完成繁重的工作。