Estou usando o token = token.replaceAll(word, token); para ignorar qualquer pontuação, mas não está funcionando

import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;
import java.util.Scanner;

public class Exercicio {
public static void main(String[] args) {
Map<String, Integer> myMap = new HashMap<String, Integer>();
createMap(myMap);
displayMap(myMap);
}

private static void createMap(Map<String, Integer> map) {
Scanner scanner = new Scanner(System.in);

System.out.println("Digite uma string:");
String input = scanner.nextLine();
String[] tokens = input.split(" ");

for (String token : tokens) {
  String word = token.toLowerCase();
  token = token.replaceAll(word, token); 
  
  if (map.containsKey(word)) {
    int count = map.get(word);
    map.put(word, count + 1);
  } else
    map.put(word, 1);
}

scanner.close();

}

private static void displayMap(Map<String, Integer> map) {
Set keys = map.keySet();
TreeSet sortedKeys = new TreeSet(keys);

System.out.println("\nMapa contém:\nChave\t\tValor");

for (String key : sortedKeys)
  System.out.printf("%-10s%10s\n", key, map.get(key));

System.out.printf("\ntamanho: %d\nestá vazio: %b\n", map.size(), map.isEmpty());

}
}

Isso não faz sentido. Veja a documentação de replaceAll: o primeiro parâmetro é uma expressão regular indicando o que vc quer trocar, e o segundo parâmetro é o que vai ser colocado no lugar (por exemplo, replaceAll("a", "b") troca todas as letras “a” por “b”, replaceAll("x", "") troca todos os “x” pela string vazia - ou seja, remove os “x”).

Se quer ignorar pontuação, primeiro você tem que definir o que quer remover. É “tudo que não for letra”?
Se for, aí seria algo como:

word = word.replaceAll("\\P{L}", "");

A notação \P{L} remove tudo que não é letra (incluindo qualquer caractere Unicode, ou seja, também considera letras de outros alfabetos).

O problema é que isso pode quebrar palavras compostas (como “beija-flor”, que vira “beijaflor”). E aí vc tem que definir se quer conviver com isso ou tratar esses casos (e a expressão vai ficando cada vez mais complicada).

1 curtida

Entendi, muito obrigado!