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

Подсчёт количества слов в строке с помощью 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 хранит каждое слово один раз.

Примеры и тест-кейсы

  1. Базовый пример: "java is great and java is fun"
    • java: 2, is: 2, great: 1, and: 1, fun: 1
  2. С пунктуацией: "Hello, World! Hello Java."
    • hello: 2, world: 1, java: 1
  3. Разные регистры: "Java JAVA java" → java: 3
  4. Пустая строка: "" → {} (пустая HashMap)
  5. Одно слово: "test" → {test: 1}

Edge cases и типичные ошибки

  1. Null значение: Необходимо проверить null перед работой со строкой.
  2. Пунктуация: Слова "java" и "java!" должны считаться как одно слово — используем regex для удаления спецсимволов.
  3. Регистр: Все слова приводятся к нижнему регистру для корректного подсчёта.
  4. Порядок вывода: HashMap не гарантирует порядок. Если нужен отсортированный результат, используйте TreeMap или отсортируйте entryset.
  5. Производительность: HashMap работает в среднем O(1) для операций get/put, что делает метод очень эффективным.

использование getOrDefault() делает код компактным и безошибочным. Это изящный способ работы с HashMap в Java.