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.Stringse 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
- Criamos o map
frutascom quatro frutas e quantidades. - Usamos
delete(frutas, "uva")para remover a fruta "uva". - Criamos uma slice
chavescom capacidade iniciallen(frutas)para evitar realocações. - Iteramos sobre o map com
for fruta := range frutase adicionamos cada chave à slice. - Usamos
sort.Strings(chaves)para ordenar as chaves alfabeticamente. - 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
sortnã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