fork(2) download
  1. import java.text.Normalizer;
  2. import java.util.ArrayList;
  3. import java.util.LinkedHashSet;
  4.  
  5. class Fonetica {
  6.  
  7. public static void main(String[] args) {
  8. Fonetica fonetica = new Fonetica();
  9. ArrayList<String> palavras = new ArrayList<>();
  10.  
  11. palavras.add("NEUSA");
  12. palavras.add("ÇAPO");
  13. palavras.add("MAÇÃ");
  14. palavras.add("MASSÃ");
  15. palavras.add("EXCEÇÃO");
  16. palavras.add("EXCEÇÕES");
  17. palavras.add("ASPECTO");
  18. palavras.add("AZPECTO");
  19. palavras.add("LAGOZTA");
  20. palavras.add("EREZIAH");
  21. palavras.add("HERESIA");
  22. palavras.add("EXIGIR");
  23. palavras.add("EZIGIR");
  24. palavras.add("PACTO");
  25. palavras.add("QUANTIDADE");
  26. palavras.add("QUERO");
  27. palavras.add("HORIENTAR");
  28. palavras.add("PALHA");
  29. palavras.add("FALHA");
  30. palavras.add("ANNA");
  31. palavras.add("ANÃ");
  32. palavras.add("FACULDADE");
  33. palavras.add("ÚTIL");
  34. palavras.add("INÚTIL");
  35. palavras.add("CEREJA");
  36. palavras.add("OPONENTE");
  37. palavras.add("OPOSIÇÃO");
  38. palavras.add("CAIXA");
  39. palavras.add("TRAVESSEIRO");
  40. palavras.add("ALMOÇO");
  41. palavras.add("PASSEAR");
  42. palavras.add("PNEU");
  43. palavras.add("ALFACE");
  44. palavras.add("ESPAÇO");
  45. palavras.add("OURO");
  46. palavras.add("PEIXE");
  47. palavras.add("ÓLEO");
  48. palavras.add("ALHO");
  49. palavras.add("PESSÊGO");
  50. palavras.add("ACENTUAÇÃO");
  51. palavras.add("CÃO");
  52. palavras.add("CRISTÃ");
  53. palavras.add("AMANHÃ");
  54. palavras.add("SÃO");
  55. palavras.add("FAMÍLIA");
  56. palavras.add("FAMÍLHA");
  57.  
  58. for (String palavra : palavras) {
  59. System.out.println(palavra + " - " + fonetica.converter(palavra));
  60. }
  61. }
  62.  
  63. public String converterFrase(String frase) {
  64. LinkedHashSet<String> palavras;
  65.  
  66. palavras = this.converter(frase.split(" "));
  67.  
  68. return String.join(" ", palavras);
  69. }
  70.  
  71. public LinkedHashSet<String> converter(String... palavras) {
  72. LinkedHashSet<String> resultado = new LinkedHashSet<>();
  73.  
  74. for (String palavra : palavras) {
  75. resultado.add(this.converter(palavra));
  76. }
  77.  
  78. return resultado;
  79. }
  80.  
  81. public String converter(String palavra) {
  82. palavra = palavra.toUpperCase();
  83.  
  84. palavra = palavra.replace("Ç", "SS");
  85. palavra = palavra.replace("Y", "I");
  86. palavra = palavra.replace("W", "V"); // "W" não tem uma regra definida, as vezes é "V", as vezes é "U"
  87. palavra = palavra.replace("GT", "");
  88. palavra = palavra.replace("Q", "K");
  89. palavra = palavra.replace("SH", "X");
  90. palavra = palavra.replace("CH", "X");
  91. palavra = palavra.replace("PH", "F");
  92. palavra = palavra.replace("LH", "LI");
  93. palavra = palavra.replace("NH", "NI");
  94. palavra = palavra.replace("H", ""); // O "H" é a única letra do nosso alfabeto sem valor fonético.
  95.  
  96. palavra = this.removerDuplicadas(palavra);
  97.  
  98. // Acentuações
  99. palavra = palavra.replaceAll("([ÃÕ])([EO])", "$1-$2"); // Separa as sílabas
  100. palavra = palavra.replaceAll("([ÃÕ])", "$1M");
  101. palavra = this.removerAcentos(palavra);
  102.  
  103. palavra = palavra.replaceAll("([BDP])([^AEIOU]|$)", "$1I$2"); // "B", "D" e "P" mudos
  104. palavra = palavra.replaceAll("C([AOUR])", "K$1"); // "CA", "CO" e "CU" viram "KA", "KO" e "KU" respectivamente
  105. palavra = palavra.replaceAll("C([EI])", "SS$1"); // "CE" e "CI" viram "SSE" e "SSI" respecivamente
  106. palavra = palavra.replaceAll("C([^AEIOU]|$)", "KI$1"); // "C" mudo tem som de "KI"
  107. palavra = palavra.replaceAll("G([EI])", "J$1"); // "GE" e "GI" tem som de "JE" e "JI" respectivamente
  108. palavra = palavra.replaceAll("L([^AEIOU]|$)", "U$1"); // Quando o "L" vem antes de consoante
  109. palavra = palavra.replaceAll("N([^AEIOU]|$)", "M$1"); // Quando "N" for seguida de uma consoante, recebe o som fechado "M"
  110. palavra = palavra.replaceAll("X([^AEIOU]|$)", "SS$1"); // Quando o "X" é seguido por uma vogal, tem som de "SS"
  111. palavra = palavra.replaceAll("([AEIOU])S([AEIOU])", "$1Z$2");
  112. palavra = palavra.replaceAll("Z([^AEIOU]|$)", "SS$1"); // "Z" seguido de vogal tem som de "SS"
  113.  
  114. palavra = palavra.replaceAll("S+", "S"); // Mais de 1 "S" vira apenas 1
  115. palavra = palavra.replace("OU", "O"); // Quando o "U" segue o "O" não tem som
  116.  
  117. return palavra;
  118. }
  119.  
  120. private String removerDuplicadas(String texto) {
  121. String[] letras = "ABCDEFGHIJKLMNOPQRTUVWYXZ".split("");
  122.  
  123. for (String letra : letras) {
  124. texto = texto.replaceAll(letra + "+", letra);
  125. }
  126.  
  127. return texto;
  128. }
  129.  
  130. private String removerAcentos(String texto) {
  131. texto = Normalizer.normalize(texto, Normalizer.Form.NFD);
  132. texto = texto.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
  133.  
  134. return texto;
  135. }
  136. }
  137.  
Success #stdin #stdout 0.09s 711680KB
stdin
Standard input is empty
stdout
NEUSA - NEUZA
ÇAPO - SAPO
MAÇÃ - MASAM
MASSÃ - MASAM
EXCEÇÃO - ESESAM-O
EXCEÇÕES - ESESOM-ES
ASPECTO - ASPEKITO
AZPECTO - ASPEKITO
LAGOZTA - LAGOSTA
EREZIAH - EREZIA
HERESIA - EREZIA
EXIGIR - EXIJIR
EZIGIR - EZIJIR
PACTO - PAKITO
QUANTIDADE - KUAMTIDADE
QUERO - KUERO
HORIENTAR - ORIEMTAR
PALHA - PALIA
FALHA - FALIA
ANNA - ANA
ANÃ - ANAM
FACULDADE - FAKUUDADE
ÚTIL - UTIU
INÚTIL - INUTIU
CEREJA - SEREJA
OPONENTE - OPONEMTE
OPOSIÇÃO - OPOZISAM-O
CAIXA - KAIXA
TRAVESSEIRO - TRAVESEIRO
ALMOÇO - AUMOSO
PASSEAR - PASEAR
PNEU - PINEU
ALFACE - AUFASE
ESPAÇO - ESPASO
OURO - ORO
PEIXE - PEIXE
ÓLEO - OLEO
ALHO - ALIO
PESSÊGO - PESEGO
ACENTUAÇÃO - ASEMTUASAM-O
CÃO - KAM-O
CRISTÃ - KRISTAM
AMANHÃ - AMANIAM
SÃO - SAM-O
FAMÍLIA - FAMILIA
FAMÍLHA - FAMILIA