Как посчитать количество вхождений слова в строку, состоящую слов
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Подсчёт количества вхождений слова в строку
Это классическая задача обработки текста, которая часто встречается на собеседованиях. Существует несколько подходов с разной сложностью и производительностью.
Подход 1: Использование split() и count
Самый простой и понятный способ — разделить строку на слова и подсчитать нужное:
String text = "java java python java javascript";
String word = "java";
String[] words = text.split("\\s+");
int count = 0;
for (String w : words) {
if (w.equals(word)) {
count++;
}
}
System.out.println(count); // 3
Или более компактно с Stream API:
int count = (int) Arrays.stream(text.split("\\s+"))
.filter(w -> w.equals(word))
.count();
Преимущества: понятный и читаемый код, быстро на малых данных.
Недостатки: создаёт временный массив, может быть неэффективно на больших объёмах.
Подход 2: Использование регулярных выражений
Можно использовать паттерны для поиска слова с границами слова:
String text = "java java python java javascript";
String word = "java";
Pattern pattern = Pattern.compile("\\b" + Pattern.quote(word) + "\\b");
Matcher matcher = pattern.matcher(text);
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println(count); // 3
Преимущества: работает с частичными совпадениями, учитывает границы слов.
Недостатки: медленнее на больших текстах, сложнее компилировать паттерны.
Подход 3: indexOf() в цикле
Итеративный поиск слова в строке:
String text = "java java python java javascript";
String word = "java";
int count = 0;
int index = 0;
while ((index = text.indexOf(word, index)) != -1) {
count++;
index += word.length();
}
System.out.println(count); // Найдёт также "java" в "javascript"
Для точного совпадения со словами:
int count = 0;
int index = 0;
while ((index = text.indexOf(word, index)) != -1) {
// Проверяем границы слова
boolean isWordStart = index == 0 || !Character.isLetterOrDigit(text.charAt(index - 1));
boolean isWordEnd = index + word.length() == text.length() ||
!Character.isLetterOrDigit(text.charAt(index + word.length()));
if (isWordStart && isWordEnd) {
count++;
}
index += word.length();
}
Подход 4: Apache Commons Lang
Есть готовая утилита в популярной библиотеке:
import org.apache.commons.lang3.StringUtils;
int count = StringUtils.countMatches(text, word);
Сравнение производительности
| Метод | Время | Память | Сложность |
|---|---|---|---|
| split() + filter | Быстро | Среднее | O(n) |
| Regex | Средне | Среднее | O(n·m) |
| indexOf() | Быстро | Минимум | O(n·m) |
| Commons | Быстро | Минимум | O(n) |
где n — длина текста, m — длина слова.
Рекомендация
Для большинства случаев используй split() + Stream API — это понятно и достаточно быстро. Если нужна максимальная производительность — indexOf() с проверкой границ или Apache Commons Lang.StringUtils.countMatches().