Перебор элементов множества
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 36 из 68.
Теперь, когда ты умеешь добавлять элементы в множество, проверять их наличие и удалять их, пора научиться перебирать все элементы. Поскольку множество в Go построено на основе карты, для доступа к каждому элементу можно использовать знакомый цикл for...range.
Чтобы перебрать множество, используется тот же синтаксис, что и для перебора отображения, но важны только ключи:
for color := range colors {
fmt.Println(color)
}Обрати внимание, что в цикле по диапазону мы используем только одну переменную. Поскольку значения нам не нужны (это пустые структуры), их можно полностью игнорировать. Так каждый цвет из множества будет выведен на отдельной строке.
Если хочешь явно указать, что значение нужно игнорировать, можешь также использовать форму с двумя переменными:
for color, _ := range colors {
fmt.Println(color)
}Имейте в виду, что при переборе элементов карты в Go порядок не гарантируется, поэтому при каждом запуске программы элементы вашего множества могут выводиться в разном порядке. Для множеств это совершенно нормально: они предназначены для проверки принадлежности элемента, а не для поддержания порядка.
Задание
ЛегкоСоздай анализатор музыкальных плейлистов, который обрабатывает коллекции песен и отображает подробную информацию о каждом плейлисте, используя идиому множеств в Go. Это задание демонстрирует, как перебирать множества, чтобы изучать их содержимое и создавать отчёты.
Тебе будут переданы два входных значения:
- Строка с рок-песнями, разделёнными запятыми (например,
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - Строка с поп-песнями, разделёнными запятыми (например,
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
Твоя задача:
- Создать два множества с помощью идиомы Go
map[string]struct{}, чтобы отдельно хранить рок-песни и поп-песни - Разобрать обе входные строки, разделив их по запятым, чтобы получить названия отдельных песен
- Добавить каждую песню в соответствующее множество, используя пустой литерал структуры
{}в качестве значения - Отобразить анализ рок-плейлиста:
- Заголовок:
"Rock Playlist Analysis:" - Количество:
"Total rock songs: [count]" - Заголовок списка песен:
"Songs in rock playlist:" - Каждая песня на отдельной строке:
"♪ [song_title]"
- Заголовок:
- Отобразить анализ поп-плейлиста:
- Заголовок:
"Pop Playlist Analysis:" - Количество:
"Total pop songs: [count]" - Заголовок списка песен:
"Songs in pop playlist:" - Каждая песня на отдельной строке:
"♪ [song_title]"
- Заголовок:
- Создать объединённый плейлист, объединив оба множества в новое множество
- Отобразить анализ объединённого плейлиста:
- Заголовок:
"Combined Playlist Analysis:" - Количество:
"Total unique songs: [count]" - Заголовок списка песен:
"All songs in combined playlist:" - Каждая песня на отдельной строке:
"♫ [song_title]"
- Заголовок:
- В завершение отобразить сводку:
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
Используй пакет strings, чтобы разделить входные строки по запятым. Для перебора каждого множества используй цикл for...range с одной переменной, чтобы получать только ключи (названия песен). Это задание демонстрирует, как перебор множеств в Go позволяет изучить все элементы коллекции, что делает такой подход идеальным для задач анализа и составления отчётов.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Считайте строки целиком с помощью bufio.Scanner (обрабатывает названия песен с пробелами)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// Создайте множества, используя принятый в Go приём map[string]struct{}
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// Разберите входные строки и заполните множества
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO: Напишите свой код ниже
// Добавьте песни в соответствующие множества
// Выведите анализ рок-плейлиста (отсортируйте песни для стабильного вывода)
// Выведите анализ поп-плейлиста (отсортируйте песни для стабильного вывода)
// Создайте и выведите анализ объединённого плейлиста (отсортируйте песни для стабильного вывода)
// Выведите сводку по плейлистам
// Помните: преобразуйте ключи map в срез, отсортируйте его, затем переберите элементы, чтобы сохранить стабильный порядок
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведение6Идиоматический Go: множества
Идиома множества в GoСоздание множестваДобавление элементов в множествоПроверка наличия элементаУдаление элемента из множестваПеребор элементов множестваПовторение — уникальные имена пользователейПотренируйтесь самостоятельно: Онлайн-компилятор Go