Menu
Coddy logo textTech

Iterando sobre um Conjunto

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 36 de 68.

Agora que você pode adicionar, verificar e remover elementos do seu conjunto, é hora de aprender como iterar por todos os elementos. Como o seu conjunto em Go é construído sobre um mapa, você pode usar o familiar loop for...range para acessar cada elemento.

Para iterar sobre um set, você usa a mesma sintaxe que ao iterar sobre um map, mas você só se preocupa com as chaves:

for color := range colors {
    fmt.Println(color)
}

Observe que estamos usando apenas uma variável no loop range. Como não precisamos dos valores (que são todos structs vazios), podemos ignorá-los inteiramente. Isso imprimirá cada cor em seu conjunto, uma por linha.

Você também pode usar a forma de duas variáveis se preferir ser explícito sobre ignorar o valor:

for color, _ := range colors {
    fmt.Println(color)
}

Tenha em mente que os maps em Go não garantem nenhuma ordem específica ao iterar, portanto, os elementos do seu conjunto podem ser impressos em uma ordem diferente cada vez que você executar o programa. Este é um comportamento perfeitamente normal para conjuntos, pois eles são projetados para testes de pertinência em vez de manter a ordem.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

challenge icon

Desafio

Fácil

Construa um analisador de playlists de música que processe coleções de músicas e exiba informações detalhadas sobre cada playlist usando o idioma de conjunto (set) do Go. Este desafio demonstra como iterar sobre conjuntos para examinar e relatar seus conteúdos.

Você receberá duas entradas:

  • Uma string contendo músicas de rock separadas por vírgulas (ex: "Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine")
  • Uma string contendo músicas pop separadas por vírgulas (ex: "Shape of You,Blinding Lights,Watermelon Sugar,Levitating")

Sua tarefa é:

  1. Criar dois conjuntos usando o idioma do Go map[string]struct{} para armazenar músicas de rock e músicas pop separadamente
  2. Analisar ambas as strings de entrada, dividindo-as por vírgulas para obter os títulos das músicas individuais
  3. Adicionar cada música ao conjunto apropriado usando o literal de struct vazia {} como valor
  4. Exibir a análise da playlist de rock:
    • Cabeçalho: "Rock Playlist Analysis:"
    • Contagem: "Total rock songs: [count]"
    • Cabeçalho de músicas: "Songs in rock playlist:"
    • Cada música em uma linha separada: "♪ [song_title]"
  5. Exibir a análise da playlist pop:
    • Cabeçalho: "Pop Playlist Analysis:"
    • Contagem: "Total pop songs: [count]"
    • Cabeçalho de músicas: "Songs in pop playlist:"
    • Cada música em uma linha separada: "♪ [song_title]"
  6. Criar uma playlist combinada mesclando ambos os conjuntos em um novo conjunto
  7. Exibir a análise da playlist combinada:
    • Cabeçalho: "Combined Playlist Analysis:"
    • Contagem: "Total unique songs: [count]"
    • Cabeçalho de músicas: "All songs in combined playlist:"
    • Cada música em uma linha separada: "♫ [song_title]"
  8. Por fim, exibir um resumo:
    • "Playlist Summary:"
    • "Rock songs: [rock_count]"
    • "Pop songs: [pop_count]"
    • "Combined unique songs: [combined_count]"

Use o pacote strings para dividir as strings de entrada nas vírgulas. Para iterar sobre cada conjunto, use o loop for...range com uma única variável para acessar apenas as chaves (títulos das músicas). Este desafio demonstra como a iteração sobre conjuntos em Go permite examinar todos os elementos em uma coleção, tornando-a perfeita para tarefas de análise e relatórios.

Folha de consulta

Para iterar sobre um conjunto (set) em Go, use o loop for...range com uma única variável para acessar apenas as chaves:

for color := range colors {
    fmt.Println(color)
}

Você também pode usar a forma de duas variáveis e ignorar explicitamente o valor:

for color, _ := range colors {
    fmt.Println(color)
}

Observe que os maps em Go não garantem nenhuma ordem específica ao iterar, portanto, os elementos do conjunto podem aparecer em ordens diferentes cada vez que você executar o programa.

Experimente você mesmo

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strings"
)

func main() {
	// Lê linhas completas usando bufio.Scanner (trata títulos de músicas com espaços)
	scanner := bufio.NewScanner(os.Stdin)

	scanner.Scan()
	rockSongs := scanner.Text()
	scanner.Scan()
	popSongs := scanner.Text()

	// Cria conjuntos usando o idioma Go map[string]struct{}
	rockSet := make(map[string]struct{})
	popSet := make(map[string]struct{})

	// Analisa as strings de entrada e preenche os conjuntos
	rockList := strings.Split(rockSongs, ",")
	popList := strings.Split(popSongs, ",")

	// TODO: Escreva seu código abaixo
	// Adiciona músicas aos seus respectivos conjuntos
	// Exibe a análise da playlist de rock (ordena as músicas para uma saída consistente)
	// Exibe a análise da playlist de pop (ordena as músicas para uma saída consistente)
	// Cria e exibe a análise da playlist combinada (ordena as músicas para uma saída consistente)
	// Exibe o resumo da playlist
	// Lembre-se: Converta as chaves do mapa para slice, ordene e então itere para uma ordem consistente

	_ = rockSet
	_ = popSet
	_ = rockList
	_ = popList
	_ = fmt.Sprintf
	_ = sort.Strings
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo