Создание множества
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 32 из 68.
Теперь, когда вы понимаете принцип идиомы множества в Go, пора применить его на практике и создать своё первое множество. Этот процесс прост и следует тем же шаблонам, которые вы уже изучили на примере карт.
Чтобы создать множество в Go, объяви переменную, используя шаблон map[T]struct{}, где T — это тип элементов, которые ты хочешь хранить. Вот как создать множество для хранения уникальных названий цветов:
colors := make(map[string]struct{})Также можно инициализировать множество начальными значениями с помощью синтаксиса литерала отображения:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Обрати внимание, что каждое значение — это пустой литерал структуры {}. Он создаёт нулевое значение struct{}, которое не занимает места в памяти, но при этом позволяет ключу существовать в карте.
Преимущество этого подхода в том, что он использует существующую инфраструктуру отображений Go, обеспечивая при этом настоящую семантику множества: каждое название цвета может встречаться только один раз, а поиск выполняется так же быстро, как и в обычных отображениях.
Задание
ЛегкоСоздай средство отслеживания предпочтений в языках программирования, которое демонстрирует идиому Go для множеств, используемых для хранения уникальных элементов. В этом задании показано, как использовать шаблон map[string]struct{} для отслеживания языков программирования без дубликатов.
Тебе будут предоставлены два входных значения:
- Строка, представляющая количество языков для обработки (например,
"6") - Строка со списком языков программирования, разделённых запятыми (например,
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
Твоя задача:
- Создать множество с помощью идиомы Go
map[string]struct{}для хранения уникальных языков программирования - Разобрать входную строку, разделив её по запятым, чтобы получить отдельные названия языков
- Добавить каждый язык в множество, используя пустой литерал структуры
{}в качестве значения - Показать результаты обработки, выводя каждый язык при его встрече:
- Если языка ещё нет в множестве:
"Added: [language]" - Если язык уже есть в множестве:
"Already exists: [language]"
- Если языка ещё нет в множестве:
- После обработки всех языков вывести сводку:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Наконец, перечислить все уникальные языки в множестве:
- Заголовок:
"Programming languages in set:" - Каждый язык на отдельной строке:
"- [language]"
- Заголовок:
Используй пакет strings, чтобы разделить входную строку, и пакет strconv, чтобы преобразовать строку с количеством в целое число. Чтобы перед добавлением проверить, есть ли язык уже в множестве, используй идиому comma ok: _, exists := languageSet[language]. Это задание демонстрирует, как идиома множеств в Go позволяет эффективно отслеживать уникальные элементы и предотвращать дубликаты в данных.
Попробуйте сами
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Считайте входные данные
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// Преобразуйте строку count в целое число (для этого задания не требуется)
_, _ = strconv.Atoi(countStr)
// Разделите строку languages по запятым
languages := strings.Split(languagesStr, ",")
// Создайте множество, используя идиому map[string]struct{}
languageSet := make(map[string]struct{})
// TODO: Напишите свой код ниже
// Обработайте каждый язык и проверьте, есть ли он во множестве
// Используйте идиому comma ok: _, exists := languageSet[language]
// Выведите "Added: [language]" или "Already exists: [language]"
// Добавьте языки во множество, используя литерал пустой структуры {}
// Выведите сводную информацию
// Выведите общее число обработанных языков и число уникальных языков
// Выведите все уникальные языки из множества
fmt.Println("Programming languages in set:")
// Преобразуйте map в срез и отсортируйте его для стабильного вывода
// Выведите каждый язык в формате "- [language]"
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведение6Идиоматический Go: множества
Идиома множества в GoСоздание множестваДобавление элементов в множествоПроверка наличия элементаУдаление элемента из множестваПеребор элементов множестваПовторение — уникальные имена пользователейПотренируйтесь самостоятельно: Онлайн-компилятор Go