Итоги: счетчик частоты слов
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 30 из 68.
Задание
ЛегкоСоздайте инструмент для анализа текста, который подсчитывает частоту слов в документе. Эта задача демонстрирует, как карты (maps) отлично справляются с агрегацией данных, отслеживая, сколько раз каждое уникальное слово встречается в тексте.
Вы получите два входных значения:
- Строку, представляющую текст для анализа (например,
"the quick brown fox jumps over the lazy dog the fox is quick") - Строку, представляющую минимальный порог частоты (например,
"2")
Важно: Входной текст может содержать пробелы, поэтому вы должны прочитать всю строку целиком, используя bufio.NewReader с ReadString('\n') или bufio.Scanner — не используйте fmt.Scanln для ввода текста, так как он прекращает чтение на первом пробеле.
Ваша задача:
- Создать функцию с именем
countWords, которая принимает строку текста и возвращаетmap[string]int, где:- Ключи — это отдельные слова (строки)
- Значения — это частота появления каждого слова (целые числа)
- Разобрать входной текст, разбив его на отдельные слова с помощью
strings.Fields(которая разделяет строку по любым пробельным символам) - Подсчитать частоту каждого слова в тексте:
- Преобразуйте все слова в нижний регистр для единообразного подсчета
- Для каждого слова увеличьте его счетчик в карте
- Если слова еще нет в карте, оно начнет с 0 и будет увеличено до 1
- Отфильтровать результаты, чтобы показать только те слова, которые встречаются не менее заданного порога раз
- Вывести результаты в следующем формате:
- Заголовок:
"Word Frequency Analysis:" - Для каждого подходящего слова:
"[word]: [count]" - Выводите слова в алфавитном порядке
- Заголовок:
- Рассчитать и вывести сводную статистику:
"Total unique words: [total_unique_count]""Words above threshold: [filtered_count]""Most frequent word: [word] ([count] times)"
Например, для входного текста "hello hello world" и порога "2", вывод должен быть следующим:
Word Frequency Analysis: hello: 2 Total unique words: 2 Words above threshold: 1 Most frequent word: hello (2 times)
Используйте пакет bufio для чтения полных строк ввода, пакет strings для разделения текста и преобразования в нижний регистр, пакет strconv для преобразования строки порога в целое число и пакет sort для сортировки слов по алфавиту. Эта задача демонстрирует, как карты предоставляют элегантное решение для подсчета и агрегации данных, а поведение нулевого значения в картах делает логику подсчета простой и эффективной.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Прочитать полную строку текста (включая пробелы)
scanner.Scan()
text := scanner.Text()
// Прочитать пороговое значение
scanner.Scan()
thresholdStr := scanner.Text()
// Преобразовать пороговое значение в целое число
threshold, _ := strconv.Atoi(thresholdStr)
// TODO: Напишите свой код ниже
// 1. Создайте функцию countWords, которая возвращает map[string]int
// Подсказка: используйте strings.Fields и strings.ToLower для разделения и нормализации слов
// 2. Используйте функцию для подсчета частоты слов
// 3. Отфильтруйте слова, которые встречаются как минимум 'threshold' раз
// 4. Отсортируйте отфильтрованные слова по алфавиту и выведите их
// 5. Рассчитайте и выведите сводную статистику
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение