Desafio Java
Contagem de palavras com HashMap
Enunciado
Crie um programa que leia uma frase (pode ser fixa no código) e use HashMap para contar quantas vezes cada palavra aparece. Considere que as palavras são separadas por espaços e ignore maiúsculas/minúsculas. Imprima o mapa resultante e a palavra que mais aparece.
Requisitos
- Usar
HashMappara contar as ocorrências. - Converter todas as palavras para minúsculas antes de contar.
- Imprimir o mapa com as contagens e a palavra mais frequente.
Código inicial
import java.util.HashMap;
import java.util.Map;
public class ContadorPalavras {
public static void main(String[] args) {
String frase = "Java é uma linguagem Java é poderosa";
// TODO: contar palavras e imprimir
}
}
Saída esperada
Contagem: {java=2, é=2, uma=1, linguagem=1, poderosa=1}
Palavra mais frequente: java (2 vezes)
Ver dica
Use split(" ") para separar palavras, toLowerCase() para padronizar e getOrDefault() para atualizar a contagem.
Mostrar solução
import java.util.HashMap;
import java.util.Map;
public class ContadorPalavras {
public static void main(String[] args) {
String frase = "Java é uma linguagem Java é poderosa";
// Divide a frase em palavras
String[] palavras = frase.toLowerCase().split(" ");
// Cria um HashMap para armazenar palavra -> contagem
Map<String, Integer> contagem = new HashMap<>();
// Conta cada palavra
for (String palavra : palavras) {
contagem.put(palavra, contagem.getOrDefault(palavra, 0) + 1);
}
// Imprime o mapa de contagens
System.out.println("Contagem: " + contagem);
// Encontra a palavra mais frequente
String maisFrequente = null;
int max = 0;
for (Map.Entry<String, Integer> entry : contagem.entrySet()) {
if (entry.getValue() > max) {
max = entry.getValue();
maisFrequente = entry.getKey();
}
}
System.out.println("Palavra mais frequente: " + maisFrequente + " (" + max + " vezes)");
}
}
Passo a passo
- Definimos uma frase fixa para o exemplo.
- Convertemos a frase para minúsculas com
toLowerCase()e dividimos por espaços comsplit(" "), gerando um array de palavras. - Criamos um
HashMap<String, Integer>para associar cada palavra à sua contagem. - Para cada palavra, usamos
getOrDefault(palavra, 0) + 1para incrementar a contagem. Se a palavra não existir, começa com 0. - Imprimimos o mapa completo. A ordem pode variar, mas no exemplo é exibida uma ordem específica.
- Iteramos sobre
entrySet()para encontrar a palavra com maior contagem, guardando o valor máximo e a palavra correspondente. - Imprimimos a palavra mais frequente e sua contagem.
Por que funciona
O HashMap é ideal para mapear chaves (palavras) a valores (contagens). A operação getOrDefault simplifica a atualização da contagem. Ao final, percorremos o mapa para achar o máximo.
Erros comuns
- Não converter para minúsculas: "Java" e "java" seriam contadas separadamente. Use
toLowerCase(). - Esquecer de tratar palavras com pontuação:
split(" ")não remove vírgulas ou pontos. Para maior robustez, usesplit("\\s+")e remova pontuação. - Modificar o mapa durante a iteração: use
entrySet()ouforEachpara evitarConcurrentModificationException.
Outra forma de resolver
Usar merge() para atualizar a contagem:
contagem.merge(palavra, 1, Integer::sum);
É mais conciso e evita o getOrDefault.
Saída esperada
Contagem: {java=2, é=2, uma=1, linguagem=1, poderosa=1}
Palavra mais frequente: java (2 vezes)