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)
}Notez que nous n’utilisons qu’une seule variable dans la boucle de parcours. Comme nous n’avons pas besoin des valeurs (qui sont toutes des structures vides), nous pouvons les ignorer entièrement. 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.
Défi
FacileConstruisez un analyseur de playlists musicales qui traite des collections de chansons et affiche des informations détaillées sur chaque playlist en utilisant l’idiome des ensembles de Go. Ce défi montre comment parcourir des ensembles pour examiner leur contenu et en rendre compte.
Vous recevrez deux entrées :
- Une chaîne contenant des chansons rock séparées par des virgules (par ex.
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - Une chaîne contenant des chansons pop séparées par des virgules (par ex.
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
Votre tâche consiste à :
- Créer deux ensembles à l’aide de l’idiome Go
map[string]struct{}afin de stocker séparément les chansons rock et les chansons pop - Analyser les deux chaînes d’entrée en les divisant sur les virgules pour obtenir les titres individuels des chansons
- Ajouter chaque chanson à l’ensemble 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 ensembles dans un nouvel ensemble
- 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 sur les virgules. Pour parcourir chaque ensemble, utilisez la boucle for...range avec une seule variable afin d’accéder uniquement aux clés (les titres des chansons). Ce défi montre comment le parcours des ensembles Go permet d’examiner tous les éléments d’une collection, ce qui le rend idéal pour les tâches d’analyse et de génération de rapports.
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 uniquesEntraînez-vous par vous-même : Compilateur Go en ligne