返回字符串" hi"的次数出现在给定字符串中的任何位置

时间:2018-05-29 00:43:15

标签: java string loops substring

我编写了以下Java代码,它返回了一个超时错误。我不确定这意味着什么,也不知道代码为什么不运行

public int countHi(String str) {
  int pos = str.indexOf("hi"); 
  int count = 0;
  while(pos!=-1)
  {
    count++;
    pos = str.substring(pos).indexOf("hi");
  }
  return count;
}

我知道另一种解决方案,使用for循环,但我真的认为这也会有用。

3 个答案:

答案 0 :(得分:2)

你进入一个无限循环,因为template: { type: "links", fields: { link: "url" } }, ... 永远不会超过第一个匹配,因为第一个匹配将包含在子字符串中。

您可以在pos循环中使用此重写版indexOf()进行修复:

while

或使用pos = str.indexOf("hi", pos + 1); 循环以避免重复调用do... while

indexOf()

答案 1 :(得分:1)

str.substring(pos)输出给定索引的子字符串。因此,在你的代码中,while循环永远不会遍历你的整个字符串,而是在第一个字符串停止" hi"。使用它。

while(pos!=-1){
   count++;
   str = str.substring(pos+2);
   pos = str.indexOf("hi");
}

str变量存储字符串的后半部分(使用+2表示另外两个索引用于结束hi)然后检查pos变量存储该指数" hi"出现在新字符串中。

答案 2 :(得分:0)

只是为了增加乐趣......

如果要计算所提供的子字符串(即:" hi")并且它在输入字符串(单个字或单词的一部分)中的位置并不重要,可以使用一个内联并让String.replace()方法为您完成工作,方法是从初始输入字符串中实际删除想要计数的所需子字符串,并计算该输入字符串的剩余部分(这不会修改初始输入字符串):

String inputString = "Hi there. This is a hit in his pocket";
String subString = "hi";
int count = (inputString.length() - inputString.replace(subString, "").
                length()) / subString.length())

//Display the result...
System.out.println(count);

控制台将显示: 3

您将注意到上面的代码区分大小写,因此在上面的示例中,子字符串" hi" 与单词" Hi&#不同34; 因为大写" H" 所以"嗨" 会被忽略。如果您想在计算所提供的子字符串时忽略字母大小写,那么您可以使用相同的代码,但在其中使用String.toLowerCase()方法:

String inputString = "Hi there. This is a hit in his pocket";
String subString = "hi";
int count = (inputString.length() - inputString.toLowerCase().
             replace(substring.toLowerCase(), "").
             length()) / substring.length())

//Display the result...
System.out.println(count);

控制台将显示: 4

但是,如果您要计算的提供的子字符串是一个特定的单词(不是另一个单词的 part ),那么它会变得更复杂一些。 一种方式可以使用PatternMatcher类以及一个小Regular Expression。它可能看起来像这样:

String inputString = "Hi there. This is a hit in his pocket";
String subString =   "Hi";
String regEx = "\\b" + subString + "\\b";

int count = 0;  // To hold the word count
// Compile the regular expression
Pattern p = Pattern.compile(regEx);
// See if there are matches of subString within the 
// input string utilizing the compiled pattern
Matcher m = p.matcher(inputString);
// Count the matches found
while (m.find()) {
    count++;
}

//Display the count result...
System.out.println(count);

控制台将显示: 1

同样,上面的代码是字母区分大小写的。换句话说,如果提供的子字符串是" hi" ,则控制台中的显示将 0 ,因为" hi&#34 ; " Hi" 不同,它实际上包含在输入字符串中作为第一个单词。如果你想忽略字母大小写,那么只需将输入字符串和提供的子字符串转换为全大写或全小写,例如:

String inputString = "Hi there. This is a hit in his pocket";
String subString =   "this is";
String regEx = "\\b" + subString.toLowerCase() + "\\b";

int count = 0;  // To hold the word count
// Compile the regular expression
Pattern p = Pattern.compile(regEx);
// See if there are matches of subString within the 
// input string utilizing the compiled pattern
Matcher m = p.matcher(inputString.toLowerCase());
// Count the matches found
while (m.find()) {
    count++;
}

//Display the count result...
System.out.println(count);

控制台将显示: 1

正如您在上面的两个最新代码示例中所见,"\\bHi\\b"的正则表达式(RegEx)被使用(在代码中,变量用于 Hi )这就是它的意思:

enter image description here