Fácil Go
Contando palavras
Enunciado
Escreva um programa que conte quantas vezes cada palavra aparece em uma frase e imprima o resultado. Use um map[string]int.
Requisitos
- Crie o map com
make. - Use
strings.Fieldspara separar as palavras. - Imprima cada palavra e sua contagem.
Código inicial
package main
import (
"fmt"
"strings"
)
func main() {
frase := "go é divertido go é rápido"
// seu código aqui
}
Saída esperada
go: 2
é: 2
divertido: 1
rápido: 1
Ver dica
Use strings.Fields(frase) para obter uma slice de palavras. Depois itere sobre ela e incremente o map.
Mostrar solução
package main
import (
"fmt"
"strings"
)
func main() {
frase := "go é divertido go é rápido"
contagem := make(map[string]int) // cria o map vazio
for _, palavra := range strings.Fields(frase) {
contagem[palavra]++ // incrementa a contagem da palavra
}
for palavra, n := range contagem {
fmt.Printf("%s: %d\n", palavra, n)
}
}
Passo a passo
- Declaramos a frase e criamos um map vazio com
make(map[string]int). strings.Fields(frase)divide a frase em palavras, ignorando espaços múltiplos.- No loop, para cada palavra,
contagem[palavra]++incrementa o valor associado. Se a palavra não existir, o valor zero (0) é usado e depois incrementado. - No segundo loop, iteramos sobre o map e imprimimos cada par chave-valor.
Por que funciona
O map armazena a contagem de cada palavra. A operação contagem[palavra]++ é segura mesmo se a palavra ainda não estiver no map, pois o valor zero do tipo int é 0. A iteração com range percorre todos os pares, mas a ordem é aleatória; por isso a saída pode variar.
Erros comuns
- Esquecer de inicializar o map:
var contagem map[string]inte depoiscontagem[palavra]++causa panic (assignment to entry in nil map). Usemake. - Usar
strings.Splitsem tratar espaços vazios:strings.Splitpode gerar strings vazias se houver espaços extras. Prefirastrings.Fields. - Assumir ordem na saída: a ordem das linhas pode mudar a cada execução. Se precisar de ordem, ordene as chaves.
Outra forma de resolver
Usar um slice de palavras e ordenar antes de contar, mas isso não é necessário. Uma alternativa é usar for _, palavra := range strings.Fields(frase) { contagem[palavra] = contagem[palavra] + 1 }, mas ++ é mais idiomático.
Saída esperada
go: 2
é: 2
divertido: 1
rápido: 1
(Nota: a ordem pode variar.)