Substituir texto "inteiro"

to fazendo um programinha que pega um texto e troca cada uma das palavras por seu sinonimo, sinonimos estes que estão em um banco de dados (mysql, diga-se de passagem), entao o programa faz basicamente isso: le um arquivo texto, substitui as palavras por sinonimos e “salva como” outro arquivo.

bom agora vamos ao problema, eu tenho uma classe de leitura que é utlizada em duas ocasiões, uma quando se importa palavras para o banco de dados, e outra quando eu for substituir o arquivo texto, eu estava pensando qual seria o melhor método para continuar essa aplicaçao:

1- pegar todas as palavras e jogar em um vetor e fazer a pesquisa no banco direto do vetor?
2- pegar uma palavra de cada vez e procurar no BD e já substituí-la?
3- outros?

lembrando que só haverá substituição quando forem palavras mesmo, ou seja “a”, “às”, “de”, “que”, etc não serão substituídas…

na primeira ocasião eu teria que usar o StringTokenizer e na segunda eu poderia utilizar o StreamTokenizer o que facilitaria um pouco a minha vida pelo fato da segunda ter mais recursos, porém acredito que eu perderia em desempenho, qual vcs acham que teria o melhor CUSTO X BENEFÍCIO?

se tiverem outra sugestao sobre o modo de recuperar cada palavra que nao sejam os TOKENIZER da vida sou todo “olhos” (se fosse uma mensagem auditiva eu seria “todo ouvidos”)

bom pra finalizar eu tenho as palavras do bd separadas por ", " (vígula depois espaço quando forem sinonimos) e um “;” (ponto e virgula para para mostrar que começam outros sinonimos como segue exemplo à baixo)

ab-rogar, anular, revocar, revogar, suprimir; ab-rogativo, ab-rogatório; ababá, alguidar, gamela, vaso; ababadar, dobrar-se, franzir, preguear; molhado, babado, babujado, cuspinhado, ababalhado; ababaloalô, babalaô, babalaxé, babalorixá, pai-de-santo; ababelar, balburdiar, baralhar, confundir, desordenar(-se), desorganizar, embaralhar(-se), embrulhar, juntar, misturar(-se); abacá, alvacá, bananeira-de-corda, cânhamo-de-manilha;

Use StreamTokenizer em vez de StringTokenizer; o segundo, fora o fato de ser “Deprecated”, é muito mais ineficiente.

O problema de StreamTokenizer é que quem escreveu essa classe (acho que você deve ter ouvido falar nele - James Gosling) imaginou que ela fosse ser usada para ler programas Java ou C. Portanto, se você não passar os parâmetros corretos, pode processar seu texto como se fosse um programa - por exemplo, pulando comentários /* */ ou //, o que pode ser algo indesejado. Mas para ler um texto com palavras em português funciona direitinho.

StringTokenizer é terrível, não o use.

Para acelerar o processo, faça o seguinte: carregue todas as palavras que você tem do banco de dados (que não devem ser muitas - no máximo umas 50.000, incluindo as que você já deixou flexionadas ou os verbos que você já deixou conjugados) em um Map (TreeMap ou HashMap). Então para efetuar a busca e troca das palavras isso será muito, muito mais rápido que ficar consultando a base palavra por palavra.

Concordo com a solução do Thingol.
Utilize HashMap que será log n “vezes” mais rápido que o TreeMap.

[pseudo-code]

Enquanto tem palavras
      palavra = proxima palavra;
      object = map.get(palavra);
      se (object != null) 
           coloca object na saida;
      senão
           coloca palavra;
      fim se
fim enquanto      

[/pseudo-code]