← Назад к вопросам

Как посчитать количество вхождений слова в строку, состоящую слов

1.2 Junior🔥 151 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подсчёт количества вхождений слова в строку

Это классическая задача обработки текста, которая часто встречается на собеседованиях. Существует несколько подходов с разной сложностью и производительностью.

Подход 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().