Menu
Coddy logo textTech

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.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

challenge icon

Desafío

Fácil

Construye 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:

  1. Crear dos conjuntos utilizando el modismo de Go map[string]struct{} para almacenar canciones de rock y canciones de pop por separado
  2. Analizar ambas cadenas de entrada dividiéndolas por comas para obtener los títulos de las canciones individuales
  3. Agregar cada canción al conjunto correspondiente utilizando el literal de estructura vacía {} como valor
  4. 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]"
  5. 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]"
  6. Crear una lista de reproducción combinada fusionando ambos conjuntos en un nuevo conjunto
  7. 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]"
  8. 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
}
quiz iconPonte a prueba

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