Menu
Coddy logo textTech

Итерация по множеству

Часть раздела Логика и управление потоком путешествия по 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 не гарантируют определенного порядка при итерации, поэтому элементы вашего множества могут выводиться в разном порядке при каждом запуске программы. Это совершенно нормальное поведение для множеств, так как они предназначены для проверки принадлежности, а не для сохранения порядка.

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

challenge icon

Задание

Легко

Создайте анализатор музыкальных плейлистов, который обрабатывает коллекции песен и отображает подробную информацию о каждом плейлисте, используя идиому множеств (set) в Go. Эта задача демонстрирует, как перебирать множества для изучения и составления отчетов об их содержимом.

Вы получите два входных значения:

  • Строка, содержащая рок-песни, разделенные запятыми (например, "Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine")
  • Строка, содержащая поп-песни, разделенные запятыми (например, "Shape of You,Blinding Lights,Watermelon Sugar,Levitating")

Ваша задача:

  1. Создать два множества, используя идиому Go map[string]struct{}, для раздельного хранения рок-песен и поп-песен
  2. Разобрать обе входные строки, разделив их по запятым, чтобы получить названия отдельных песен
  3. Добавить каждую песню в соответствующее множество, используя литерал пустой структуры {} в качестве значения
  4. Отобразить анализ рок-плейлиста:
    • Заголовок: "Rock Playlist Analysis:"
    • Количество: "Total rock songs: [count]"
    • Заголовок списка песен: "Songs in rock playlist:"
    • Каждая песня на отдельной строке: "♪ [song_title]"
  5. Отобразить анализ поп-плейлиста:
    • Заголовок: "Pop Playlist Analysis:"
    • Количество: "Total pop songs: [count]"
    • Заголовок списка песен: "Songs in pop playlist:"
    • Каждая песня на отдельной строке: "♪ [song_title]"
  6. Создать объединенный плейлист, объединив оба множества в новое множество
  7. Отобразить анализ объединенного плейлиста:
    • Заголовок: "Combined Playlist Analysis:"
    • Количество: "Total unique songs: [count]"
    • Заголовок списка песен: "All songs in combined playlist:"
    • Каждая песня на отдельной строке: "♫ [song_title]"
  8. В завершение вывести сводку:
    • "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
}
quiz iconПроверьте себя

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

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