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 не гарантирует порядок элементов при обходе, поэтому порядок записей в возвращаемой карте может отличаться от порядка слов в примере.