Вернуть количество раз, когда строка "hi" появляется в любом месте данной строки - PullRequest
0 голосов
/ 29 мая 2018

Я написал следующий код 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 голосов
/ 29 мая 2018

str.substring(pos) Вывести подстроку из заданного индекса.поэтому в вашем коде while цикл никогда не проходит через всю строку и останавливается на первом «hi». Используйте это.

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

str переменная store 2-я половина строки (используйте +2 для перемещения еще двух индексов для конца hi), затем проверьте pos переменную store, чтобы индекс "hi" появился в новой строке.

0 голосов
/ 29 мая 2018

Просто для дополнительного удовольствия ......

Если необходимо подсчитать указанную подстроку (например, "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" из-за прописных букв "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

Если, однако, указанная подстрока, которую вы хотите сосчитать, является конкретным словом (не часть другогословом) тогда становится немного сложнее. Один способ, которым вы можете сделать это, используя Pattern и Matcher Классы вместе с маленьким Регулярное выражение .Это может выглядеть примерно так:

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" отличается от "HiMsgstr ", который фактически содержится во входной строке как первое слово.Если вы хотите игнорировать регистр букв, тогда нужно просто преобразовать как входную строку, так и предоставленную подстроку в верхний или нижний регистр, например:

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

Как вы можете видеть в двух последних примерах кода выше, использовалось регулярное выражение (RegEx) "\\bHi\\b" (в коде вместо * 1074 использовалась переменная)* Привет ) и вот что это значит:

enter image description here

0 голосов
/ 29 мая 2018

Вы попали в бесконечный цикл, потому что pos никогда не опережает первое совпадение, поскольку первое совпадение будет включено в подстроку.

Это можно исправить с помощью этой переопределенной версии indexOf() внутри вашего while цикла:

pos = str.indexOf("hi", pos + 1);

Или используйте цикл do... while, чтобы избежать необходимости повторения вызова на indexOf():

public static int countHi(String str) {
    int pos = -1, count = -1;

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

    return count;
}
...