Itérer sur un ensemble
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 36 sur 68.
Maintenant que vous pouvez ajouter, vérifier et supprimer des éléments de votre ensemble, il est temps d'apprendre à parcourir tous les éléments. Puisque votre ensemble Go est basé sur une map, vous pouvez utiliser la boucle familière for...range pour accéder à chaque élément.
Pour itérer sur un set, vous utilisez la même syntaxe que pour itérer sur une map, mais vous ne vous souciez que des clés :
for color := range colors {
fmt.Println(color)
}Remarquez que nous n'utilisons qu'une seule variable dans la boucle range. Comme nous n'avons pas besoin des valeurs (qui sont toutes des structures vides), nous pouvons les ignorer complètement. Cela affichera chaque couleur de votre ensemble, une par ligne.
Vous pouvez également utiliser la forme à deux variables si vous préférez être explicite sur le fait d'ignorer la valeur :
for color, _ := range colors {
fmt.Println(color)
}Gardez à l'esprit que les maps en Go ne garantissent aucun ordre particulier lors de l'itération, de sorte que les éléments de votre ensemble peuvent être affichés dans un ordre différent à chaque exécution du programme. C'est un comportement tout à fait normal pour les ensembles, car ils sont conçus pour tester l'appartenance plutôt que pour maintenir un ordre.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileCréez un analyseur de playlist musicale qui traite des collections de chansons et affiche des informations détaillées sur chaque playlist en utilisant l'idiome des sets en Go. Ce défi démontre comment itérer sur des sets pour examiner et rendre compte de leur contenu.
Vous recevrez deux entrées :
- Une chaîne contenant des chansons de rock séparées par des virgules (par exemple,
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - Une chaîne contenant des chansons de pop séparées par des virgules (par exemple,
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
Votre tâche consiste à :
- Créer deux sets en utilisant l'idiome Go
map[string]struct{}pour stocker séparément les chansons de rock et les chansons de pop - Analyser les deux chaînes d'entrée en les divisant par les virgules pour obtenir les titres de chansons individuels
- Ajouter chaque chanson au set approprié en utilisant le littéral de structure vide
{}comme valeur - Afficher l'analyse de la playlist rock :
- En-tête :
"Rock Playlist Analysis:" - Nombre :
"Total rock songs: [count]" - En-tête des chansons :
"Songs in rock playlist:" - Chaque chanson sur une ligne séparée :
"♪ [song_title]"
- En-tête :
- Afficher l'analyse de la playlist pop :
- En-tête :
"Pop Playlist Analysis:" - Nombre :
"Total pop songs: [count]" - En-tête des chansons :
"Songs in pop playlist:" - Chaque chanson sur une ligne séparée :
"♪ [song_title]"
- En-tête :
- Créer une playlist combinée en fusionnant les deux sets dans un nouveau set
- Afficher l'analyse de la playlist combinée :
- En-tête :
"Combined Playlist Analysis:" - Nombre :
"Total unique songs: [count]" - En-tête des chansons :
"All songs in combined playlist:" - Chaque chanson sur une ligne séparée :
"♫ [song_title]"
- En-tête :
- Enfin, afficher un résumé :
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
Utilisez le package strings pour diviser les chaînes d'entrée au niveau des virgules. Pour itérer sur chaque set, utilisez la boucle for...range avec une seule variable pour accéder uniquement aux clés (titres des chansons). Ce défi démontre comment l'itération sur les sets Go vous permet d'examiner tous les éléments d'une collection, ce qui est parfait pour les tâches d'analyse et de reporting.
Aide-mémoire
Pour itérer sur un ensemble (set) en Go, utilisez la boucle for...range avec une seule variable pour accéder uniquement aux clés :
for color := range colors {
fmt.Println(color)
}Vous pouvez également utiliser la forme à deux variables et ignorer explicitement la valeur :
for color, _ := range colors {
fmt.Println(color)
}Notez que les maps en Go ne garantissent aucun ordre particulier lors de l'itération, ainsi les éléments de l'ensemble peuvent apparaître dans des ordres différents à chaque exécution du programme.
Essayez vous-même
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Lire les lignes complètes en utilisant bufio.Scanner (gère les titres de chansons avec des espaces)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// Créer des ensembles en utilisant l'idiome Go map[string]struct{}
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// Analyser les chaînes d'entrée et remplir les ensembles
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO : Écrivez votre code ci-dessous
// Ajouter les chansons à leurs ensembles respectifs
// Afficher l'analyse de la playlist rock (trier les chansons pour une sortie cohérente)
// Afficher l'analyse de la playlist pop (trier les chansons pour une sortie cohérente)
// Créer et afficher l'analyse de la playlist combinée (trier les chansons pour une sortie cohérente)
// Afficher le résumé de la playlist
// Rappel : Convertir les clés de la map en slice, trier, puis itérer pour un ordre cohérent
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements6Go idiomatique : Les ensembles
L'idiome des ensembles en GoCréer un ensembleAjouter à un ensembleVérifier l'appartenanceSupprimer d'un ensembleItérer sur un ensembleRécapitulatif - Noms d'utilisateur uniques