← Назад к вопросам
Подсчёт количества слов в строке с помощью HashMap
1.3 Junior🔥 171 комментариев
#Коллекции#Основы Java
Условие
Напишите программу на Java для подсчёта количества конкретных слов в строке, используя HashMap.
Пример
Входные данные: "java is great and java is fun"
Выходные данные:
java: 2
is: 2
great: 1
and: 1
fun: 1
Требования
- Используйте HashMap<String, Integer> для хранения слов и их количества
- Обработайте регистр (все слова в нижнем регистре)
- Выведите результат в понятном формате
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Подход
Разделяем строку на слова, приводим их к нижнему регистру и подсчитываем частоту каждого слова с помощью HashMap. Используем метод getOrDefault() для элегантного обновления счётчика.
Решение
import java.util.HashMap;
import java.util.Map;
public class WordCounter {
/**
* Подсчитывает количество каждого слова в строке.
*
* @param text строка для анализа
* @return HashMap с словами и их количеством
*/
public static Map<String, Integer> countWords(String text) {
if (text == null || text.isEmpty()) {
return new HashMap<>();
}
// Создаём HashMap для хранения слов и их частоты
Map<String, Integer> wordCount = new HashMap<>();
// Разделяем строку на слова по пробелам
// Приводим к нижнему регистру и удаляем пунктуацию
String[] words = text.toLowerCase()
.replaceAll("[^a-z0-9\\s]", "") // удаляем спецсимволы
.split("\\s+"); // разделяем по одному или более пробелам
// Подсчитываем частоту каждого слова
for (String word : words) {
if (!word.isEmpty()) {
// getOrDefault: если слова нет, берём 0, затем добавляем 1
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
}
return wordCount;
}
public static void main(String[] args) {
// Пример из задания
String text1 = "java is great and java is fun";
Map<String, Integer> result1 = countWords(text1);
System.out.println("Результат для: \"" + text1 + "\"");
result1.forEach((word, count) ->
System.out.println(word + ": " + count)
);
System.out.println();
// Пример с пунктуацией и разными регистрами
String text2 = "Hello World! Hello Java. Java is amazing!";
Map<String, Integer> result2 = countWords(text2);
System.out.println("Результат для: \"" + text2 + "\"");
result2.forEach((word, count) ->
System.out.println(word + ": " + count)
);
// hello: 2, world: 1, java: 2, is: 1, amazing: 1
System.out.println();
// Граничный случай: пустая строка
String text3 = "";
System.out.println("Пустая строка: " + countWords(text3));
// {}
}
}
Сложность
- Временная сложность: O(n), где n — количество символов в строке. Нужно перебрать каждый символ один раз при разделении и подсчёте.
- Пространственная сложность: O(m), где m — количество уникальных слов. HashMap хранит каждое слово один раз.
Примеры и тест-кейсы
- Базовый пример: "java is great and java is fun"
- java: 2, is: 2, great: 1, and: 1, fun: 1
- С пунктуацией: "Hello, World! Hello Java."
- hello: 2, world: 1, java: 1
- Разные регистры: "Java JAVA java" → java: 3
- Пустая строка: "" → {} (пустая HashMap)
- Одно слово: "test" → {test: 1}
Edge cases и типичные ошибки
- Null значение: Необходимо проверить null перед работой со строкой.
- Пунктуация: Слова "java" и "java!" должны считаться как одно слово — используем regex для удаления спецсимволов.
- Регистр: Все слова приводятся к нижнему регистру для корректного подсчёта.
- Порядок вывода: HashMap не гарантирует порядок. Если нужен отсортированный результат, используйте TreeMap или отсортируйте entryset.
- Производительность: HashMap работает в среднем O(1) для операций get/put, что делает метод очень эффективным.
использование getOrDefault() делает код компактным и безошибочным. Это изящный способ работы с HashMap в Java.