Fácil C#
Contando ocorrências com Dictionary
Enunciado
Escreva um programa que leia uma frase e conte quantas vezes cada palavra aparece. Use um Dictionary<string, int> e TryGetValue para atualizar a contagem.
Requisitos
- Usar
Dictionary<string, int>para armazenar as contagens. - Utilizar
TryGetValuepara verificar se a palavra já existe. - Imprimir cada palavra e sua contagem no formato
palavra: contagem.
Código inicial
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
string frase = "o rato roeu a roupa do rei de roma";
// Seu código aqui
}
}
Saída esperada
o: 1
rato: 1
roeu: 1
a: 1
roupa: 1
do: 1
rei: 1
de: 1
roma: 1
Ver dica
Divida a frase com Split(' ') e itere sobre as palavras. Use TryGetValue para obter a contagem atual e depois atualize o dicionário.
Mostrar solução
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
string frase = "o rato roeu a roupa do rei de roma";
var contagem = new Dictionary<string, int>();
foreach (string palavra in frase.Split(' '))
{
// Tenta obter a contagem atual; se não existir, começa com 0
contagem.TryGetValue(palavra, out int atual);
contagem[palavra] = atual + 1;
}
foreach (var par in contagem)
{
Console.WriteLine($"{par.Key}: {par.Value}");
}
}
}
Passo a passo
- Criamos um
Dictionary<string, int>para associar cada palavra à sua contagem. - Dividimos a frase em palavras usando
Split(' '). - Para cada palavra, chamamos
TryGetValuepara obter a contagem atual; se a palavra não existir,atualrecebe 0. - Atualizamos o dicionário com
contagem[palavra] = atual + 1. - Por fim, iteramos sobre o dicionário e imprimimos cada par chave-valor.
Por que funciona
O Dictionary permite acesso rápido por chave. Usar TryGetValue evita uma exceção KeyNotFoundException e faz apenas uma busca, ao contrário de verificar com ContainsKey e depois indexar. Assim, o código é seguro e eficiente.
Erros comuns
- Usar
contagem[palavra]++sem verificar se a chave existe: isso lançaKeyNotFoundExceptionna primeira ocorrência. Correção: usarTryGetValueoucontagem[palavra] = contagem.GetValueOrDefault(palavra) + 1. - Esquecer de inicializar o dicionário:
var contagem = new Dictionary<string, int>();é necessário. - Dividir a frase incorretamente:
Split(' ')não lida com múltiplos espaços; nesse caso, useSplit(new[] {' '}, StringSplitOptions.RemoveEmptyEntries).
Outra forma de resolver
Poderia usar contagem[palavra] = contagem.GetValueOrDefault(palavra) + 1; (disponível no .NET Core 2.0+). É mais conciso, mas TryGetValue é mais explícito e funciona em qualquer versão.
Saída esperada
o: 1
rato: 1
roeu: 1
a: 1
roupa: 1
do: 1
rei: 1
de: 1
roma: 1