Desafio Go

Removendo e listando chaves ordenadas

Enunciado

Implemente um programa que gerencie um inventário de frutas. O programa deve remover uma fruta específica usando delete e depois imprimir todas as frutas restantes em ordem alfabética. Use um map para armazenar as quantidades e uma slice para ordenar as chaves.

Requisitos

  • Crie um map com pelo menos 4 frutas e suas quantidades.
  • Remova uma fruta usando delete.
  • Colete as chaves restantes em uma slice, ordene com sort.Strings e imprima cada fruta com sua quantidade.

Código inicial

package main

import (
    "fmt"
    "sort"
)

func main() {
    frutas := map[string]int{
        "banana": 10,
        "maçã":   5,
        "laranja": 8,
        "uva":    12,
    }
    // seu código aqui
}

Saída esperada

banana: 10
laranja: 8
maçã: 5
uva: 12
Ver dica

Após o delete, crie uma slice vazia, itere sobre o map adicionando as chaves, use sort.Strings e depois itere sobre a slice ordenada para imprimir.

Mostrar solução
package main

import (
    "fmt"
    "sort"
)

func main() {
    frutas := map[string]int{
        "banana":  10,
        "maçã":    5,
        "laranja": 8,
        "uva":     12,
    }

    // Remove a fruta "uva"
    delete(frutas, "uva")

    // Coleta as chaves restantes
    chaves := make([]string, 0, len(frutas))
    for fruta := range frutas {
        chaves = append(chaves, fruta)
    }

    // Ordena as chaves alfabeticamente
    sort.Strings(chaves)

    // Imprime em ordem
    for _, fruta := range chaves {
        fmt.Printf("%s: %d\n", fruta, frutas[fruta])
    }
}

Passo a passo

  1. Criamos o map frutas com quatro frutas e quantidades.
  2. Usamos delete(frutas, "uva") para remover a fruta "uva".
  3. Criamos uma slice chaves com capacidade inicial len(frutas) para evitar realocações.
  4. Iteramos sobre o map com for fruta := range frutas e adicionamos cada chave à slice.
  5. Usamos sort.Strings(chaves) para ordenar as chaves alfabeticamente.
  6. Iteramos sobre a slice ordenada e imprimimos cada fruta com sua quantidade acessando frutas[fruta].

Por que funciona

A iteração sobre um map é aleatória, então não podemos confiar na ordem. Ao coletar as chaves em uma slice e ordená-las, garantimos uma saída consistente. O delete remove a entrada do map, e a slice resultante reflete apenas as chaves restantes. A capacidade inicial len(frutas) é uma otimização para evitar múltiplas realocações.

Erros comuns

  • Tentar ordenar o map diretamente: maps não têm ordem, então sort não se aplica. É preciso extrair as chaves.
  • Esquecer de inicializar a slice com capacidade: não é um erro, mas pode causar realocações desnecessárias. Use make([]string, 0, len(frutas)).
  • Modificar o map durante a iteração: não é o caso aqui, mas evite adicionar/remover chaves enquanto itera, pois o comportamento é indefinido.
  • Acessar uma chave removida: após delete, a chave não existe mais; acessá-la retorna o valor zero. Use comma-ok se precisar verificar.

Outra forma de resolver

Você pode usar sort.Slice com uma função de comparação personalizada, mas sort.Strings é mais simples para strings. Também poderia usar um slice de structs em vez de map, mas o map é mais eficiente para buscas.

Saída esperada

banana: 10
laranja: 8
maçã: 5
uva: 12