Подсчет повторений слов в строке

27. Подсчитать количество повторений каждого слова в строке

Условие задачи:
Необходимо реализовать метод countWords(String text), который принимает строку и возвращает HashMap<String, Integer>:

  • ключ — слово из строки;

  • значение — количество вхождений этого слова.

Слова разделяются одним или несколькими пробельными символами.

Код:

public class WordCounter {

    public static HashMap<String, Integer> countWords(String text) {
        // TODO
    }
}

Пример 1:

Вход:
"тест тест1 нетест слово тест2 тест1 тест тест"

Результат:
"тест"   → 3
"тест1"  → 2
"нетест" → 1
"слово"  → 1
"тест2"  → 1

Пример 2:

Вход:
"apple banana apple"

Результат:
"apple"  → 2
"banana" → 1

Спойлеры к решению

Подсказки
💡 Разбей строку на слова с помощью split("\\s+").
💡 Для хранения количества повторений используй HashMap<String, Integer>.
💡 Метод merge() позволяет компактно увеличить счётчик существующего слова или добавить новое.
💡 Для null или пустой строки можно вернуть пустую карту.

Решение
public static HashMap<String, Integer> countWords(String text) {
    HashMap<String, Integer> result = new HashMap<>();

    if (text == null || text.trim().isEmpty()) {
        return result;
    }

    String[] words = text.trim().split("\\s+");

    for (String word : words) {
        result.merge(word, 1, Integer::sum);
    }

    return result;
}

Строка сначала разбивается на слова:

String[] words = text.trim().split("\\s+");

Регулярное выражение \\s+ означает один или несколько пробельных символов, поэтому корректно обрабатываются несколько пробелов подряд, табуляции и переносы строк.

Для каждого слова выполняется:

result.merge(word, 1, Integer::sum);

Если слова ещё нет в карте, оно добавляется со значением 1. Если уже есть, текущее значение увеличивается на 1.

Например:

"apple banana apple"

даст следующие частоты:

apple  → 2
banana → 1

Временная сложность в среднем — O(n), где n — количество символов в строке. Дополнительная память — O(k), где k — количество различных слов.

HashMap не гарантирует порядок элементов при обходе, поэтому порядок записей в возвращаемой карте может отличаться от порядка слов в примере.