Über ein Set iterieren
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 36 von 68.
Nachdem Sie nun Elemente zu Ihrem Set hinzufügen, prüfen und daraus entfernen können, ist es an der Zeit zu lernen, wie man über alle Elemente iteriert. Da Ihr Go-Set auf einer Map basiert, können Sie die vertraute for...range-Schleife verwenden, um auf jedes Element zuzugreifen.
Um über ein Set zu iterieren, verwenden Sie dieselbe Syntax wie beim Iterieren über eine Map, aber Sie interessieren sich nur für die Schlüssel:
for color := range colors {
fmt.Println(color)
}Beachte, dass wir in der Bereichsschleife nur eine Variable verwenden. Da wir die Werte nicht benötigen (bei denen es sich allesamt um leere Strukturen handelt), können wir sie vollständig ignorieren. Dadurch wird jede Farbe in deiner Menge jeweils in einer eigenen Zeile ausgegeben.
Sie können auch die Form mit zwei Variablen verwenden, wenn Sie explizit angeben möchten, dass der Wert ignoriert wird:
for color, _ := range colors {
fmt.Println(color)
}Bedenken Sie, dass Maps in Go beim Iterieren keine bestimmte Reihenfolge garantieren, sodass Ihre Set-Elemente bei jedem Programmdurchlauf in einer anderen Reihenfolge ausgegeben werden können. Dies ist ein völlig normales Verhalten für Sets, da sie für die Prüfung der Zugehörigkeit und nicht für die Beibehaltung einer Reihenfolge konzipiert sind.
Aufgabe
EinfachErstelle einen Musik-Playlist-Analysator, der Musiksammlungen verarbeitet und mithilfe des Go-Set-Idioms detaillierte Informationen zu jeder Playlist anzeigt. Diese Herausforderung zeigt, wie man über Sets iteriert, um deren Inhalte zu untersuchen und darüber zu berichten.
Du erhältst zwei Eingaben:
- Eine Zeichenkette mit durch Kommas getrennten Rocksongs (z. B.
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - Eine Zeichenkette mit durch Kommas getrennten Popsongs (z. B.
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
Deine Aufgabe ist es:
- Zwei Sets mit dem Go-Idiom
map[string]struct{}zu erstellen, um Rocksongs und Popsongs getrennt zu speichern - Beide Eingabezeichenketten durch Aufteilen an den Kommas zu analysieren, um einzelne Songtitel zu erhalten
- Jeden Song mit dem leeren Struktur-Literal
{}als Wert zum entsprechenden Set hinzuzufügen - Die Analyse der Rock-Playlist anzuzeigen:
- Kopfzeile:
"Rock Playlist Analysis:" - Anzahl:
"Total rock songs: [count]" - Song-Kopfzeile:
"Songs in rock playlist:" - Jeder Song in einer eigenen Zeile:
"♪ [song_title]"
- Kopfzeile:
- Die Analyse der Pop-Playlist anzuzeigen:
- Kopfzeile:
"Pop Playlist Analysis:" - Anzahl:
"Total pop songs: [count]" - Song-Kopfzeile:
"Songs in pop playlist:" - Jeder Song in einer eigenen Zeile:
"♪ [song_title]"
- Kopfzeile:
- Eine kombinierte Playlist zu erstellen, indem beide Sets zu einem neuen Set zusammengeführt werden
- Die Analyse der kombinierten Playlist anzuzeigen:
- Kopfzeile:
"Combined Playlist Analysis:" - Anzahl:
"Total unique songs: [count]" - Song-Kopfzeile:
"All songs in combined playlist:" - Jeder Song in einer eigenen Zeile:
"♫ [song_title]"
- Kopfzeile:
- Zum Schluss eine Zusammenfassung anzuzeigen:
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
Verwende das Paket strings, um die Eingabezeichenketten an den Kommas aufzuteilen. Um über jedes Set zu iterieren, verwende die for...range-Schleife mit einer einzelnen Variablen, um nur auf die Schlüssel (Songtitel) zuzugreifen. Diese Herausforderung zeigt, wie man durch die Iteration über Go-Sets alle Elemente einer Sammlung untersuchen kann, wodurch sie sich hervorragend für Analyse- und Berichtsaufgaben eignet.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Ganze Zeilen mit bufio.Scanner lesen (verarbeitet Songtitel mit Leerzeichen)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// Sets mit dem Go-Idiom map[string]struct{} erstellen
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// Eingabestrings parsen und Sets befüllen
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO: Schreiben Sie Ihren Code unten
// Songs zu ihren jeweiligen Sets hinzufügen
// Rock-Playlist-Analyse anzeigen (Songs für eine konsistente Ausgabe sortieren)
// Pop-Playlist-Analyse anzeigen (Songs für eine konsistente Ausgabe sortieren)
// Kombinierte Playlist-Analyse erstellen und anzeigen (Songs für eine konsistente Ausgabe sortieren)
// Playlist-Zusammenfassung anzeigen
// Denken Sie daran: Map-Keys in Slice umwandeln, sortieren und dann für eine konsistente Reihenfolge iterieren
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten6Idiomatisches Go: Sets
Das Set-Idiom in GoEin Set erstellenElemente zu einem Set hinzufügenPrüfen auf MitgliedschaftAus einem Set entfernenÜber ein Set iterierenZusammenfassung – Eindeutige BenutzernamenÜbe selbstständig: Online-Go-Compiler