Iterar sobre un Set
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 36 de 68.
Ahora que puedes añadir, comprobar y eliminar elementos de tu conjunto, es hora de aprender a iterar a través de todos los elementos. Dado que tu conjunto de Go está construido sobre un mapa, puedes usar el conocido bucle for...range para acceder a cada elemento.
Para iterar sobre un set, se utiliza la misma sintaxis que al iterar sobre un map, pero solo te interesan las claves:
for color := range colors {
fmt.Println(color)
}Observa que solo estamos usando una variable en el bucle range. Como no necesitamos los valores (que son todos structs vacíos), podemos ignorarlos por completo. Esto imprimirá cada color de tu conjunto, uno por línea.
También puedes usar la forma de dos variables si prefieres ser explícito al ignorar el valor:
for color, _ := range colors {
fmt.Println(color)
}Ten en cuenta que los mapas en Go no garantizan ningún orden particular al iterar, por lo que los elementos de tu conjunto pueden imprimirse en un orden diferente cada vez que ejecutes el programa. Este es un comportamiento perfectamente normal para los conjuntos, ya que están diseñados para la comprobación de pertenencia en lugar de para mantener el orden.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilConstruye un analizador de listas de reproducción de música que procese colecciones de canciones y muestre información detallada sobre cada lista utilizando el modismo de conjuntos (sets) en Go. Este desafío demuestra cómo iterar sobre conjuntos para examinar e informar sobre su contenido.
Recibirás dos entradas:
- Una cadena que contiene canciones de rock separadas por comas (por ejemplo,
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - Una cadena que contiene canciones de pop separadas por comas (por ejemplo,
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
Tu tarea es:
- Crear dos conjuntos utilizando el modismo de Go
map[string]struct{}para almacenar canciones de rock y canciones de pop por separado - Analizar ambas cadenas de entrada dividiéndolas por comas para obtener los títulos de las canciones individuales
- Agregar cada canción al conjunto correspondiente utilizando el literal de estructura vacía
{}como valor - Mostrar el análisis de la lista de reproducción de rock:
- Encabezado:
"Rock Playlist Analysis:" - Conteo:
"Total rock songs: [count]" - Encabezado de canciones:
"Songs in rock playlist:" - Cada canción en una línea separada:
"♪ [song_title]"
- Encabezado:
- Mostrar el análisis de la lista de reproducción de pop:
- Encabezado:
"Pop Playlist Analysis:" - Conteo:
"Total pop songs: [count]" - Encabezado de canciones:
"Songs in pop playlist:" - Cada canción en una línea separada:
"♪ [song_title]"
- Encabezado:
- Crear una lista de reproducción combinada fusionando ambos conjuntos en un nuevo conjunto
- Mostrar el análisis de la lista de reproducción combinada:
- Encabezado:
"Combined Playlist Analysis:" - Conteo:
"Total unique songs: [count]" - Encabezado de canciones:
"All songs in combined playlist:" - Cada canción en una línea separada:
"♫ [song_title]"
- Encabezado:
- Finalmente, mostrar un resumen:
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
Utiliza el paquete strings para dividir las cadenas de entrada por comas. Para iterar sobre cada conjunto, utiliza el bucle for...range con una sola variable para acceder solo a las claves (títulos de las canciones). Este desafío demuestra cómo iterar sobre conjuntos en Go te permite examinar todos los elementos de una colección, lo que lo hace perfecto para tareas de análisis y generación de informes.
Hoja de referencia
Para iterar sobre un conjunto en Go, utiliza el bucle for...range con una sola variable para acceder solo a las claves:
for color := range colors {
fmt.Println(color)
}También puedes usar la forma de dos variables e ignorar explícitamente el valor:
for color, _ := range colors {
fmt.Println(color)
}Ten en cuenta que los mapas en Go no garantizan ningún orden particular al iterar, por lo que los elementos del conjunto pueden aparecer en diferentes órdenes cada vez que ejecutes el programa.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Leer líneas completas usando bufio.Scanner (maneja títulos de canciones con espacios)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// Crear conjuntos usando el modismo de Go map[string]struct{}
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// Analizar las cadenas de entrada y poblar los conjuntos
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO: Escribe tu código a continuación
// Agregar canciones a sus respectivos conjuntos
// Mostrar el análisis de la lista de reproducción de rock (ordenar canciones para una salida consistente)
// Mostrar el análisis de la lista de reproducción de pop (ordenar canciones para una salida consistente)
// Crear y mostrar el análisis de la lista de reproducción combinada (ordenar canciones para una salida consistente)
// Mostrar el resumen de la lista de reproducción
// Recuerda: Convertir las claves del mapa a un slice, ordenar y luego iterar para un orden consistente
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos6Go idiomático: Sets
El modismo de Set en GoCrear un SetAñadir a un SetComprobar pertenenciaEliminar de un SetIterar sobre un SetResumen: Nombres de usuario únicos