Menu
CoddyTech

Создание множества

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 32 из 68.

Теперь, когда вы понимаете принцип идиомы множества в Go, пора применить его на практике и создать своё первое множество. Этот процесс прост и следует тем же шаблонам, которые вы уже изучили на примере карт.

Чтобы создать множество в Go, объяви переменную, используя шаблон map[T]struct{}, где T — это тип элементов, которые ты хочешь хранить. Вот как создать множество для хранения уникальных названий цветов:

colors := make(map[string]struct{})

Также можно инициализировать множество начальными значениями с помощью синтаксиса литерала отображения:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

Обрати внимание, что каждое значение — это пустой литерал структуры {}. Он создаёт нулевое значение struct{}, которое не занимает места в памяти, но при этом позволяет ключу существовать в карте.

Преимущество этого подхода в том, что он использует существующую инфраструктуру отображений Go, обеспечивая при этом настоящую семантику множества: каждое название цвета может встречаться только один раз, а поиск выполняется так же быстро, как и в обычных отображениях.

challenge icon

Задание

Легко

Создай средство отслеживания предпочтений в языках программирования, которое демонстрирует идиому Go для множеств, используемых для хранения уникальных элементов. В этом задании показано, как использовать шаблон map[string]struct{} для отслеживания языков программирования без дубликатов.

Тебе будут предоставлены два входных значения:

  • Строка, представляющая количество языков для обработки (например, "6")
  • Строка со списком языков программирования, разделённых запятыми (например, "Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")

Твоя задача:

  1. Создать множество с помощью идиомы Go map[string]struct{} для хранения уникальных языков программирования
  2. Разобрать входную строку, разделив её по запятым, чтобы получить отдельные названия языков
  3. Добавить каждый язык в множество, используя пустой литерал структуры {} в качестве значения
  4. Показать результаты обработки, выводя каждый язык при его встрече:
    • Если языка ещё нет в множестве: "Added: [language]"
    • Если язык уже есть в множестве: "Already exists: [language]"
  5. После обработки всех языков вывести сводку:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. Наконец, перечислить все уникальные языки в множестве:
    • Заголовок: "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]"
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go