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 HashMap para 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

  1. Definimos uma frase fixa para o exemplo.
  2. Convertemos a frase para minúsculas com toLowerCase() e dividimos por espaços com split(" "), gerando um array de palavras.
  3. Criamos um HashMap<String, Integer> para associar cada palavra à sua contagem.
  4. Para cada palavra, usamos getOrDefault(palavra, 0) + 1 para incrementar a contagem. Se a palavra não existir, começa com 0.
  5. Imprimimos o mapa completo. A ordem pode variar, mas no exemplo é exibida uma ordem específica.
  6. Iteramos sobre entrySet() para encontrar a palavra com maior contagem, guardando o valor máximo e a palavra correspondente.
  7. 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, use split("\\s+") e remova pontuação.
  • Modificar o mapa durante a iteração: use entrySet() ou forEach para evitar ConcurrentModificationException.

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)