Menu
CoddyTech

Перебор элементов множества

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

Теперь, когда ты умеешь добавлять элементы в множество, проверять их наличие и удалять их, пора научиться перебирать все элементы. Поскольку множество в Go построено на основе карты, для доступа к каждому элементу можно использовать знакомый цикл for...range.

Чтобы перебрать множество, используется тот же синтаксис, что и для перебора отображения, но важны только ключи:

for color := range colors {
    fmt.Println(color)
}

Обрати внимание, что в цикле по диапазону мы используем только одну переменную. Поскольку значения нам не нужны (это пустые структуры), их можно полностью игнорировать. Так каждый цвет из множества будет выведен на отдельной строке.

Если хочешь явно указать, что значение нужно игнорировать, можешь также использовать форму с двумя переменными:

for color, _ := range colors {
    fmt.Println(color)
}

Имейте в виду, что при переборе элементов карты в Go порядок не гарантируется, поэтому при каждом запуске программы элементы вашего множества могут выводиться в разном порядке. Для множеств это совершенно нормально: они предназначены для проверки принадлежности элемента, а не для поддержания порядка.

challenge icon

Задание

Легко

Создай анализатор музыкальных плейлистов, который обрабатывает коллекции песен и отображает подробную информацию о каждом плейлисте, используя идиому множеств в 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 позволяет изучить все элементы коллекции, что делает такой подход идеальным для задач анализа и составления отчётов.

Попробуйте сами

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
}
quiz iconПроверьте себя

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

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

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