Menu
Coddy logo textTech

Iterowanie po zbiorze

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 36 z 68.

Teraz, gdy potrafisz dodawać elementy do zbioru, sprawdzać je i usuwać, czas nauczyć się iterować po wszystkich elementach. Ponieważ zbiór w Go jest zbudowany na mapie, możesz użyć znanej pętli for...range, aby uzyskać dostęp do każdego elementu.

Aby iterować po zbiorze, używasz tej samej składni co podczas iterowania po mapie, ale interesują cię tylko klucze:

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

Zauważ, że w pętli zakresowej używamy tylko jednej zmiennej. Ponieważ nie potrzebujemy wartości (które są pustymi strukturami), możemy je całkowicie zignorować. Spowoduje to wyświetlenie każdego koloru z zestawu w osobnym wierszu.

Jeśli wolisz wyraźnie zaznaczyć, że ignorujesz wartość, możesz też użyć formy z dwiema zmiennymi:

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

Pamiętaj, że mapy w Go nie gwarantują określonej kolejności podczas iterowania, więc elementy zbioru mogą być wyświetlane w innej kolejności za każdym razem, gdy uruchomisz program. To zupełnie normalne zachowanie zbiorów, ponieważ służą one do sprawdzania przynależności elementów, a nie do zachowywania kolejności.

challenge icon

Wyzwanie

Łatwy

Zbuduj analizator playlist muzycznych, który przetwarza kolekcje utworów i wyświetla szczegółowe informacje o każdej playliście, używając idiomu zbioru w Go. To wyzwanie pokazuje, jak iterować po zbiorach, aby sprawdzać i raportować ich zawartość.

Otrzymasz dwa wejścia:

  • Łańcuch znaków zawierający utwory rockowe rozdzielone przecinkami (np. "Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine")
  • Łańcuch znaków zawierający utwory pop rozdzielone przecinkami (np. "Shape of You,Blinding Lights,Watermelon Sugar,Levitating")

Twoje zadanie:

  1. Utwórz dwa zbiory przy użyciu idiomu Go map[string]struct{}, aby osobno przechowywać utwory rockowe i pop
  2. Podziel oba wejściowe łańcuchy znaków po przecinkach, aby uzyskać tytuły poszczególnych utworów
  3. Dodaj każdy utwór do odpowiedniego zbioru, używając pustego literału struktury {} jako wartości
  4. Wyświetl analizę playlisty rockowej:
    • Nagłówek: "Rock Playlist Analysis:"
    • Liczba: "Total rock songs: [count]"
    • Nagłówek utworów: "Songs in rock playlist:"
    • Każdy utwór w osobnym wierszu: "♪ [song_title]"
  5. Wyświetl analizę playlisty pop:
    • Nagłówek: "Pop Playlist Analysis:"
    • Liczba: "Total pop songs: [count]"
    • Nagłówek utworów: "Songs in pop playlist:"
    • Każdy utwór w osobnym wierszu: "♪ [song_title]"
  6. Utwórz połączoną playlistę, łącząc oba zbiory w nowy zbiór
  7. Wyświetl analizę połączonej playlisty:
    • Nagłówek: "Combined Playlist Analysis:"
    • Liczba: "Total unique songs: [count]"
    • Nagłówek utworów: "All songs in combined playlist:"
    • Każdy utwór w osobnym wierszu: "♫ [song_title]"
  8. Na koniec wyświetl podsumowanie:
    • "Playlist Summary:"
    • "Rock songs: [rock_count]"
    • "Pop songs: [pop_count]"
    • "Combined unique songs: [combined_count]"

Użyj pakietu strings, aby podzielić wejściowe łańcuchy znaków po przecinkach. Aby iterować po każdym zbiorze, użyj pętli for...range z jedną zmienną, która umożliwia dostęp wyłącznie do kluczy (tytułów utworów). To wyzwanie pokazuje, że iterowanie po zbiorach w Go pozwala sprawdzać wszystkie elementy kolekcji, dzięki czemu świetnie nadaje się do zadań związanych z analizą i raportowaniem.

Spróbuj swoich sił

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strings"
)

func main() {
	// Odczytaj całe wiersze za pomocą bufio.Scanner (obsługuje tytuły piosenek zawierające spacje)
	scanner := bufio.NewScanner(os.Stdin)

	scanner.Scan()
	rockSongs := scanner.Text()
	scanner.Scan()
	popSongs := scanner.Text()

	// Utwórz zbiory, korzystając z idiomu Go map[string]struct{}
	rockSet := make(map[string]struct{})
	popSet := make(map[string]struct{})

	// Przeanalizuj ciągi wejściowe i wypełnij zbiory
	rockList := strings.Split(rockSongs, ",")
	popList := strings.Split(popSongs, ",")

	// TODO: Napisz swój kod poniżej
	// Dodaj piosenki do odpowiednich zbiorów
	// Wyświetl analizę rockowej playlisty (posortuj piosenki, aby zapewnić spójną kolejność wyników)
	// Wyświetl analizę popowej playlisty (posortuj piosenki, aby zapewnić spójną kolejność wyników)
	// Utwórz i wyświetl analizę połączonej playlisty (posortuj piosenki, aby zapewnić spójną kolejność wyników)
	// Wyświetl podsumowanie playlisty
	// Pamiętaj: przekształć klucze mapy w slice, posortuj go, a następnie iteruj po nim, aby zachować stałą kolejność

	_ = rockSet
	_ = popSet
	_ = rockList
	_ = popList
	_ = fmt.Sprintf
	_ = sort.Strings
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online