Итерация по множеству
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 36 из 68.
Теперь, когда вы умеете добавлять, проверять и удалять элементы из вашего множества, пришло время узнать, как перебирать все элементы. Поскольку ваше множество в Go построено на основе карты (map), вы можете использовать знакомый цикл for...range для доступа к каждому элементу.
Для итерации по множеству (set) используется тот же синтаксис, что и для итерации по карте (map), но вас интересуют только ключи:
for color := range colors {
fmt.Println(color)
}Обратите внимание, что мы используем только одну переменную в цикле range. Поскольку нам не нужны значения (которые представляют собой пустые структуры), мы можем полностью их игнорировать. Это выведет каждый цвет из вашего набора, по одному в строке.
Вы также можете использовать форму с двумя переменными, если вы предпочитаете явно указать на игнорирование значения:
for color, _ := range colors {
fmt.Println(color)
}Имейте в виду, что карты в Go не гарантируют определенного порядка при итерации, поэтому элементы вашего множества могут выводиться в разном порядке при каждом запуске программы. Это совершенно нормальное поведение для множеств, так как они предназначены для проверки принадлежности, а не для сохранения порядка.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте анализатор музыкальных плейлистов, который обрабатывает коллекции песен и отображает подробную информацию о каждом плейлисте, используя идиому множеств (set) в 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 позволяет изучать все элементы коллекции, что идеально подходит для задач анализа и отчетности.
Шпаргалка
Для итерации по множеству в Go используйте цикл for...range с одной переменной для доступа только к ключам:
for color := range colors {
fmt.Println(color)
}Вы также можете использовать форму с двумя переменными и явно игнорировать значение:
for color, _ := range colors {
fmt.Println(color)
}Обратите внимание, что карты (maps) в 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: Напишите свой код ниже
// Добавьте песни в соответствующие множества
// Отобразите анализ рок-плейлиста (отсортируйте песни для стабильного вывода)
// Отобразите анализ поп-плейлиста (отсортируйте песни для стабильного вывода)
// Создайте и отобразите анализ объединенного плейлиста (отсортируйте песни для стабильного вывода)
// Отобразите сводку по плейлистам
// Помните: преобразуйте ключи карты в срез, отсортируйте, затем итерируйте для стабильного порядка
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователей