SGBD Oracle - Implementação de Função para Fonetização em Português
Veja neste artigo a implementação de função para fonetização em Português.
I – Introdução
Todos que trabalham com informática, e neste caso me dirijo principalmente aos profissionais
que lidam com Sistemas de Gerenciamento de Banco de Dados(SGBDS), sabem da existência
de centenas de funções úteis nos SGBDS que gostaríamos de utilizar, mas que por terem sido concebidas para outros países, com língua e sistemas métricos diferentes, se mostram inviáveis para utilização no nosso ambiente operacional. Uma maneira muito interessante de tratar essa limitação, existente na maioria dos SGBDS, é lançarmos mão da criação de nossas próprias funções, adequando-as ao nosso ambiente e necessidades. Vamos exemplificar esse procedimento com a criação de um procedimento armazenado em Java seu acesso como uma função pública no SGBD Oracle.
Por que implementar a função no SGBD e não na aplicação? Confesso que esta discussão esta muito em pauta e, que coloca muitas vezes os administradores de Banco de Dados em conflito com os Desenvolvedores de Aplicação, na minha modesta opinião o assunto deve ser tratado caso a caso com a devida isenção técnica levando em conta vários fatores que podem pesar pela opção do SGBD, tais como:
· A natureza da organização – para grandes Organizações, como Bancos Comerciais, seu maior patrimônio são os dados e pelo porte de suas organizações a mudança de SGBD não é uma opção constante, conheço organizações que trabalham a
mais de 10 anos com o mesmo SGBD e todos os seus projetos para daqui a 5 anos incluem o mesmo SGBD. Neste caso a independência da aplicação com relação ao SGBD não é fator chave, inclusive a sugestão de alteração do SGBD por parte de desenvolvedores externos é visto com muitas reservas. Nestes casos o cliente espera justamente o contrário, que se obtenha o máximo de seu SGBD, valorizando seu investimento, que não é pequeno.
· Muitas organizações com SGBD centralizado, Federado ou não, e que possuem ambiente de desenvolvimento e produção muito heterogêneos, com base de dados única optam pela centralização das regras de negócio no SGBD para evitarem os risco de perda da “inteligência “ da sua atividade e fortalecer a padronização sobre os diversos aplicativos que executam em paralelo. Dessa forma uma aplicações diferentes (Delphi-client-server, .NET ou Java) realizam exatamente o mesmo procedimento padronizado no Banco de Dados. Ao mesmo tempo em que o cliente domina a “inteligência” de seu negócio ele impõe uma padronização aos seus desenvolvedores, sem se utilizar de Servidores de Aplicação ou protocolos criados para essa finalidade.
Não estou querendo afirmar que sempre se devam criar as funções no SGBD, não se deve, mas que sempre se deve proceder à análise da melhor alternativa para cada caso.
I I – Função para busca fonética em Português
Um problema comum na localização de registros, principalmente nomes próprios, vem da maneira como palavras pronunciadas da mesma maneira possuem diversas grafias, por exemplo Rafael e Raphael, Valter e Walter, etc.. que tem exatamente a mesma pronuncia, mas que possuem grafias diferentes o que torna a busca com operadores relacionais e funções, como “like”, ineficientes em muitos casos. Para a língua Inglesa existe, em diversos sistemas, a função Soundex (para maiores detalhes procure a documentação do seu SGBD e caso queira conhecer um pouco mais sobre este algoritmo uma ótima referência é ART OF COMPUTER PROGRAMMING - V.3 SORTING AND SEARCHING, KNUTH, DONALD ERVIN).
Antes de entrar na função propriamente dita, abrimos um parêntese, existem diversas abordagens a esse problema, como por exemplo: A função deve ser inserida no banco ou aplicativo?, Como proceder a fonetização?(devemos fonetizar o nome completo ou cada parte do mesmo?) Existe um modelo que maximiza a eficiência do algoritmo?. Estas questões extrapolam o escopo desse pequeno artigo no qual vamos nos concentrar com a função de fonetização, sua implementação no banco de dados e sua utilização fazendo às vezes da função “soundex”. Só para deixar registro existe um alfabético fonético internacional, já reparou nos caracteres “esquisitos” de seu dicionário inglês-português?, infelizmente os lingüistas de língua portuguesa não se deram, ainda, a importância que seria a existência de padronização fonética em caracteres da língua portuguesa para a informática, isso quer dizer que em virtude de diferenças nestes algoritmos podemos ter diferenças de resultados, mas este é um assunto para outro momento, e um dos motivos que podem servir de justificativa para que a função fique centralizada no SGBD.
I I I– Procedimento Java Armazenado
Como citado anteriormente iremos construir nossa função tomando como base procedimentos armazenados em Java, se possível leia novamente as edições 4 e 5 da SQLMagazine.
A decisão de se usar procedimentos armazenados em Java no Oracle, e não uma linguagem como C/C++, é que os mesmos são executados originalmente no JVM do Oracle no espaço de endereço do banco de dados, com isso temos menor número de trocas de contexto entre processos ao nível de sistema operacional ao mesmo tempo em que o código Java esta sempre executando como “proprietário do software Oracle”, detalhe o Oracle possui uma JDK embutido, Oracle9i - jdk 1.3 e o 10g - jdk 1.4 ambos Aurora. Para este exemplo utilizamos o Oracle 9i, creio que o mesmo funcionará sem maiores problemas para o Oracle 10G, porém não é possível implementar esses procedimento no Oracle Express Edition(XE) pois o mesmo não possui suporte para tal.
Neste exemplo iremos montar nossa classe Java fonetizar com a utilização do comando
CREATE JAVA, este comando cria um objeto contendo um fonte de código Java ou uma Classe(maiores detalhes Oracle9i – SQL Reference – a96540.pdf) o comando utilizado terá a seguinte sintaxe:
<tt> </tt>
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "Fonetica" As ...
O fonte da função de fonetização em Java, para a língua portuguesa que iremos utilizar é a disponibilizada pelo Instituto do Coração da Faculdade de Medicina da Universidade de São Paulo, que desenvolveu alguns componentes de fonetização em Java com suporte CORBA e está disponibilizando-os com código fonte aberto
(licença GNU) no Consórcio de Componentes de Software para Sistemas de Informação em Saúde (CCS-SIS). Estes componentes de fonetização foram utilizados na implementação do Serviço de Identificação de Pacientes (PIDS) e estão disponíveis em : <tt>http://www.incor.usp.br/spdweb/ccssis/fonetica/.</tt>
Visando simplificar a sua utilização usamos, apenas um pequeno fragmento desse pacote, mas fortemente indico a todos que o estudem por completo.
O Comando com o algoritmo Java completo está na listagem 1(anexos).
I V – Procedimento Java Armazenado
Uma vez criada a classe temos que a tornar acessível para nossos usuários, isso se dá com a criação de uma função, obs.: Lembro que são necessárias as permissões e privilégios para a realização dessas tarefas.
CREATE OR REPLACE FUNCTION FONETIZAR (str VARCHAR) RETURN VARCHAR
AS LANGUAGE JAVA NAME 'Fonetica.fonetizar(java.lang.String) return java.lang.String';
Por fim agora podemos criar um sinônimo público para tornar disponível a todos os usuários do nosso banco a função que acabamos de criar.
CREATE PUBLIC SYNONYM FONETIZAR FOR FONETIZAR;
Neste momento podemos testar nossa função, imaginado uma tabela FUNCIONARIO , com o campo nome (varchar) a pesquisa poderia ser feita da seguinte forma:
SELECT NOME, CPF FROM FUNCIONARIOS
WHERE
FONETIZAR(NOME)=FONETIZAR(“RAPHAEL”)
Poderíamos obter como resultado tanto o funcionário “RAPHAEL” como “RAFAEL”, uma outra customização possível seria a construção de uma tabela com os nomes “fonetizados” juntamente com um índice para a tabela FUNCIONARIO, com isso pode-se realizar uma busca mais rápida e com “fragmentos” do nome, poderíamos ter como retorno LUIZ RAPHAEL ou ROBERTO RAFAEL, juntamente com os resultados já retornados.
Espero que tenham gostado, e até a próxima.
V - Anexos
Listagem 1
<tt>CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "Fonetica" AS</tt>
<tt>import java.util.*;</tt>
<tt>public class Fonetica { </tt>
<tt> public static String fonetizar (String str) {</tt>
<tt> </tt><tt>//Fonetiza o string recebido como parametro e devolve</tt>
<tt> //um outro string (que e o primeiro fonetizado)</tt>
<tt> </tt>
<tt> str = str.toUpperCase(); //todas as letras maiusculas</tt>
<tt> str = removePrep(str); //remove as preposições</tt>
<tt> str = removeAccentuation(str); //remove os acentos</tt>
<tt> str = removeStrange(str); //remove caracteres diferentes de</tt>
<tt> // A-Z, 0-9</tt>
<tt> str = fonetize(str); //fonetiza o texto</tt>
<tt> </tt><tt>return str;</tt>
<tt> } </tt>
<tt> </tt>
<tt> public static String fonetize (String str) {</tt>
<tt> </tt><tt>//Função que faz efetivamente a substituição de letras, </tt>
<tt> //fonetizando o texto</tt>
<tt> </tt>
<tt> //matrizes de caracteres utilizadas para manipular o texto</tt>
<tt> </tt><tt>char[] foncmp = new char[256];</tt>
<tt> char[] fonwrk = new char[256];</tt>
<tt> char[] fonaux = new char[256];</tt>
<tt> char[] fonfon = new char[256];</tt>
<tt> </tt>
<tt> </tt><tt>int i, j, x, k, //contadores</tt>
<tt> desloc, //posicao atual no vetor</tt>
<tt> endfon, //indica se eh ultimo fonema</tt>
<tt> copfon, //indica se o fonema deve ser copiado</tt>
<tt> copmud, newmud; //indica se o fonema eh mudo</tt>
<tt> </tt>
<tt> //Vetor utilizado para armazenar o texto:</tt>
<tt> //cada palavra do texto e armazenada em uma posicao do vetor</tt>
<tt> </tt><tt>Vector component = new Vector();</tt>
<tt> </tt>
<tt> i = 0;</tt>
<tt> </tt><tt>j = 0;//zera os contadores</tt>
<tt> </tt>
<tt> str = removeMultiple(str);</tt>
<tt> //todos os caracteres duplicados sao eliminados</tt>
<tt> //exemplo: SS -> S, RR -> R</tt>
<tt> </tt>
<tt> component = strToVector(str);</tt>
<tt> //o texto eh armazenado no vetor:</tt>
<tt> //cada palavra ocupa uma posicao do vetor</tt>
<tt> </tt>
<tt> </tt>
<tt> for (desloc = 0; desloc < component.size(); desloc ++) {</tt>
<tt> //percorre o vetor, palavra a palavra</tt>
<tt> </tt>
<tt> </tt><tt>for (i = 0; i < 256; i++) {</tt>
<tt> fonwrk[i] = ' ';</tt>
<tt> </tt><tt>fonfon[i] = ' ';//branqueia as matrizes</tt>
<tt> }//for</tt>
<tt> </tt>
<tt> foncmp = component.elementAt(desloc).toString().toCharArray();</tt>
<tt> fonaux = foncmp;</tt>
<tt> //matrizes recebem os caracteres da palavra atual</tt>
<tt> </tt>
<tt> </tt><tt>j = 0;</tt>
<tt> </tt>
<tt> if (component.elementAt(desloc).toString().length() == 1) {</tt>
<tt> </tt><tt>fonwrk[0] = foncmp[0];</tt>
<tt> //se a palavra possuir apenas 1 caracter, nao altera a palavra</tt>
<tt> </tt>
<tt> </tt><tt>if (foncmp[0] == '_') {</tt>
<tt> fonwrk[0] = ' ';</tt>
<tt> </tt><tt>//se o caracter for "_", troca por espaco em branco</tt>
<tt> </tt>
<tt> </tt><tt>}//if</tt>
<tt> else</tt>
<tt> if ((foncmp[0] == 'E')||</tt>
<tt> (foncmp[0] == '&')||</tt>
<tt> (foncmp[0] == 'I')) {</tt>
<tt> </tt><tt>fonwrk[0] = 'i';</tt>
<tt> //se o caracter for "E", "&" ou "I", troca por "i"</tt>
<tt> </tt>
<tt> </tt><tt>}//if</tt>
<tt> }//if</tt>
<tt> else {</tt>
<tt> for (i = 0; i < component.elementAt(desloc).toString().length(); i++)</tt>
<tt> </tt><tt>//percorre a palavra corrente, caracter a caracter</tt>
<tt> </tt>
<tt> </tt><tt>if (foncmp[i] == '_')</tt>
<tt> fonfon[i] = 'Y'; // _ -> Y</tt>
<tt> else</tt>
<tt> if (foncmp[i] == '&')</tt>
<tt> fonfon[i] = 'i'; //& -> i</tt>
<tt> else</tt>
<tt> if ((foncmp[i] == 'E') ||</tt>
<tt> (foncmp[i] == 'Y') ||</tt>
<tt> (foncmp[i] == 'I'))</tt>
<tt> fonfon[i] = 'i'; // E, Y, I -> i</tt>
<tt> else</tt>
<tt> if ((foncmp[i] == 'O') ||</tt>
<tt> </tt><tt>(foncmp[i] == 'U'))</tt>
<tt> fonfon[i] = 'o'; // O, U -> u</tt>
<tt> </tt><tt>else</tt>
<tt> if (foncmp[i] == 'A')</tt>
<tt> fonfon[i] = 'a'; // A -> a</tt>
<tt> else</tt>
<tt> if (foncmp[i] == 'S')</tt>
<tt> fonfon[i] = 's'; // S -> s</tt>
<tt> else</tt>
<tt> </tt><tt>fonfon[i] = foncmp[i];</tt>
<tt> //caracter nao eh modificado</tt>
<tt> </tt>
<tt> endfon = 0;</tt>
<tt> fonaux = fonfon;</tt>
<tt> </tt>
<tt> //palavras formadas por apenas 3 consoantes </tt>
<tt> //sao dispensadas do processo de fonetizacao</tt>
<tt> </tt><tt>if (fonaux[3] == ' ')</tt>
<tt> if ((fonaux[0] == 'a') ||</tt>
<tt> (fonaux[0] == 'i') ||</tt>
<tt> (fonaux[0] == 'o'))</tt>
<tt> endfon = 0;</tt>
<tt> else</tt>
<tt> if ((fonaux[1] == 'a') ||</tt>
<tt> (fonaux[1] == 'i') ||</tt>
<tt> (fonaux[1] == 'o'))</tt>
<tt> endfon = 0;</tt>
<tt> else</tt>
<tt> if ((fonaux[2] == 'a') ||</tt>
<tt> (fonaux[2] == 'i') ||</tt>
<tt> (fonaux[2] == 'o'))</tt>
<tt> endfon = 0;</tt>
<tt> else {</tt>
<tt> endfon = 1;</tt>
<tt> fonwrk[0] = fonaux[0];</tt>
<tt> fonwrk[1] = fonaux [1];</tt>
<tt> fonwrk[2] = fonaux [2];</tt>
<tt> }//else</tt>
<tt> </tt>
<tt> if (endfon != </tt><tt>1) { //se a palavra nao for formada por apenas 3 consoantes...</tt>
<tt> </tt><tt>for (i = 0; i < component.elementAt(desloc).toString().length(); i++) {</tt>
<tt> </tt><tt>//percorre a palavra corrente, letra a letra</tt>
<tt> </tt>
<tt> copfon = 0;</tt>
<tt> copmud = 0;</tt>
<tt> newmud = 0;</tt>
<tt> //zera variaveis de controle</tt>
<tt> </tt>
<tt> switch (fonaux[i]) {</tt>
<tt> </tt>
<tt> case 'a': //se o caracter for a</tt>
<tt> </tt>
<tt> //se a palavra termina com As, AZ, AM, ou AN,</tt>
<tt> //elimina a consoante do final da palavra</tt>
<tt> if ((fonaux[i+1]== 's') ||</tt>
<tt> (fonaux[i+1]== 'Z') ||</tt>
<tt> (fonaux[i+1]== 'M') ||</tt>
<tt> (fonaux[i+1]== 'N'))</tt>
<tt> if(fonaux[i+2]!= ' ')</tt>
<tt> </tt><tt>copfon = 1;</tt>
<tt> else {</tt>
<tt> fonwrk[j] = 'a';</tt>
<tt> fonwrk[j+1] = ' ';</tt>
<tt> j++;</tt>
<tt> i++;</tt>
<tt> }//else</tt>
<tt> else copfon = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> </tt><tt>case 'B': //se o caracter for B</tt>
<tt> </tt>
<tt> // B nao eh modificado</tt>
<tt> copmud = 1;</tt>
<tt> </tt><tt>break;</tt>
<tt> </tt>
<tt> case 'C': //se o caracter for C</tt>
<tt> </tt>
<tt> x = 0;</tt>
<tt> if (fonaux[i+1] == 'i')</tt>
<tt> </tt>
<tt> </tt><tt>//ci vira si</tt>
<tt> { fonwrk[j] = 's';</tt>
<tt> </tt><tt>j++;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //coes final vira cao</tt>
<tt> if ((fonaux[i+1] == 'o') &&</tt>
<tt> (fonaux[i+2] == 'i') &&</tt>
<tt> (fonaux[i+3] == 's') &&</tt>
<tt> (fonaux[i+4] == ' '))</tt>
<tt> { fonwrk[j] = 'K';</tt>
<tt> fonwrk[j+1] = 'a';</tt>
<tt> fonwrk[j+2] = 'o';</tt>
<tt> i = i + 4;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //ct vira t</tt>
<tt> if (fonaux[i+1] == 'T')</tt>
<tt> break;</tt>
<tt> </tt>
<tt> // c vira k</tt>
<tt> if (fonaux[i+1] != </tt><tt>'H')</tt>
<tt> { fonwrk[j] = 'K';</tt>
<tt> newmud = 1;</tt>
<tt> </tt>
<tt> // ck vira k</tt>
<tt> </tt><tt>if (fonaux[i+1] == 'K')</tt>
<tt> { i++;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> else break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //ch vira k para chi final, chi vogal, chini final e</tt>
<tt> </tt><tt>//chiti final</tt>
<tt> </tt>
<tt> //chi final ou chi vogal</tt>
<tt> </tt><tt>if (fonaux[i+1] == 'H')</tt>
<tt> if (fonaux[i+2] == 'i')</tt>
<tt> if ((fonaux[i+3] == 'a')||</tt>
<tt> (fonaux[i+3] == 'i')||</tt>
<tt> (fonaux[i+3] == 'o'))</tt>
<tt> x = 1;</tt>
<tt> </tt>
<tt> // chini final</tt>
<tt> else</tt>
<tt> if (fonaux[i+3] == 'N')</tt>
<tt> if (fonaux[i+4] == 'i')</tt>
<tt> if (fonaux[i+5] == ' ')</tt>
<tt> x = 1;</tt>
<tt> </tt>
<tt> else;</tt>
<tt> else;</tt>
<tt> else</tt>
<tt> // chiti final</tt>
<tt> if (fonaux[i+3] == 'T')</tt>
<tt> if (fonaux[i+4] == 'i')</tt>
<tt> if (fonaux[i+5] == ' ')</tt>
<tt> x = 1;</tt>
<tt> if (x == 1)</tt>
<tt> { fonwrk[j] = 'K';</tt>
<tt> </tt><tt>j++;</tt>
<tt> i++;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //chi, nao chi final, chi vogal, chini final ou chiti final</tt>
<tt> //ch nao seguido de i</tt>
<tt> //se anterior nao e s, ch = x</tt>
<tt> if (j > 0)</tt>
<tt> </tt>
<tt> //sch: fonema recua uma posicao</tt>
<tt> </tt><tt>if (fonwrk[j-1] == 's')</tt>
<tt> { j--;</tt>
<tt> }//if</tt>
<tt> fonwrk[j] = 'X';</tt>
<tt> newmud = 1;</tt>
<tt> </tt><tt>i++;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'D': //se o caracter for D</tt>
<tt> x = 0;</tt>
<tt> </tt>
<tt> //procura por dor</tt>
<tt> if (fonaux[i+1] != 'o')</tt>
<tt> </tt><tt>{ copmud = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> if (fonaux[i+2] == 'R')</tt>
<tt> if (i != 0)</tt>
<tt> x = 1; // dor nao inicial</tt>
<tt> else copfon = 1; // dor inicial</tt>
<tt> else copfon = 1; // nao e dor</tt>
<tt> if (x == 1)</tt>
<tt> if (fonaux[i+3] == 'i')</tt>
<tt> if (fonaux[i+4] == 's') // dores</tt>
<tt> if (fonaux[i+5] != </tt><tt>' ')</tt>
<tt> x = 0; // nao e dores</tt>
<tt> else;</tt>
<tt> </tt><tt>else x = 0;</tt>
<tt> else</tt>
<tt> if (fonaux[i+3] == 'a')</tt>
<tt> if (fonaux[i+4] != ' ')</tt>
<tt> </tt><tt>if (fonaux[i+4] != 's')</tt>
<tt> </tt><tt>x = 0;</tt>
<tt> else</tt>
<tt> if (fonaux[i+5] != </tt><tt>' ')</tt>
<tt> </tt><tt>x = 0;</tt>
<tt> else;</tt>
<tt> else;</tt>
<tt> else x = 0;</tt>
<tt> else x = 0;</tt>
<tt> if (x == 1)</tt>
<tt> { fonwrk[j] = 'D';</tt>
<tt> fonwrk[j+1] = 'o';</tt>
<tt> fonwrk[j+2] = 'R';</tt>
<tt> i = i + 5;</tt>
<tt> }//if</tt>
<tt> else copfon = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'F': //se o caracter for F</tt>
<tt> </tt>
<tt> //F nao eh modificado</tt>
<tt> copmud = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'G': //se o caracter for G</tt>
<tt> </tt>
<tt> //gui -> gi</tt>
<tt> if (fonaux[i+1] == 'o')</tt>
<tt> if (fonaux[i+2] == 'i')</tt>
<tt> { fonwrk[j] = 'G';</tt>
<tt> fonwrk[j+1] = 'i';</tt>
<tt> j += 2;</tt>
<tt> i +=2;</tt>
<tt> </tt><tt>}//if</tt>
<tt> //diferente de gui copia como consoante muda</tt>
<tt> </tt><tt>else copmud = 1;</tt>
<tt> else</tt>
<tt> </tt>
<tt> //gl</tt>
<tt> if (fonaux[i+1] == 'L')</tt>
<tt> if (fonaux[i+2] == 'i')</tt>
<tt> </tt>
<tt> //gli + vogal -> li + vogal</tt>
<tt> if ((fonaux[i+3]=='a')||</tt>
<tt> (fonaux[i+3]=='i')||</tt>
<tt> (fonaux[i+3]=='o'))</tt>
<tt> { fonwrk[j] = fonaux[i+1];</tt>
<tt> </tt><tt>fonwrk[j+1] = fonaux[i+2];</tt>
<tt> j += 2;</tt>
<tt> </tt><tt>i += 2;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> </tt>
<tt> //glin -> lin</tt>
<tt> if(fonaux[i+3] == 'N')</tt>
<tt> </tt><tt>{ fonwrk[j] = fonaux[i+1];</tt>
<tt> fonwrk[j+1] = fonaux[i+2];</tt>
<tt> </tt><tt>j += 2;</tt>
<tt> i += 2;</tt>
<tt> }/*if*/</tt>
<tt> else copmud = 1;</tt>
<tt> else copmud = 1;</tt>
<tt> else</tt>
<tt> </tt>
<tt> //gn + vogal -> ni + vogal</tt>
<tt> if (fonaux[i+1] == 'N')</tt>
<tt> if((fonaux[i+2]!='a')&&</tt>
<tt> </tt><tt>(fonaux[i+2]!='i')&&</tt>
<tt> (fonaux[i+2]!='o'))</tt>
<tt> </tt><tt>copmud = 1;</tt>
<tt> else</tt>
<tt> { fonwrk[j] = 'N';</tt>
<tt> fonwrk[j+1] = 'i';</tt>
<tt> j += 2;</tt>
<tt> i++;</tt>
<tt> }//else</tt>
<tt> else</tt>
<tt> </tt>
<tt> // ghi -> gi</tt>
<tt> if (fonaux[i+1] == 'H')</tt>
<tt> if (fonaux[i+2] == 'i')</tt>
<tt> { fonwrk[j] = 'G';</tt>
<tt> fonwrk[j+1] = 'i';</tt>
<tt> j += 2;</tt>
<tt> i +=2;</tt>
<tt> }//if</tt>
<tt> else copmud = 1;</tt>
<tt> else copmud = 1;</tt>
<tt> </tt><tt>break;</tt>
<tt> </tt>
<tt> case 'H': //se o caracter for H</tt>
<tt> </tt>
<tt> //H eh desconsiderado</tt>
<tt> </tt><tt>break;</tt>
<tt> </tt>
<tt> case 'i': //se o caracter for i</tt>
<tt> </tt>
<tt> if (fonaux[i+2] == ' ')</tt>
<tt> </tt>
<tt> </tt><tt>//is ou iz final perde a consoante</tt>
<tt> </tt><tt>if (fonaux[i+1] == 's')</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> if (fonaux[i+1] == 'Z')</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //ix</tt>
<tt> </tt><tt>if (fonaux[i+1] != 'X')</tt>
<tt> </tt><tt>copfon = 1;</tt>
<tt> else</tt>
<tt> if (i != 0)</tt>
<tt> copfon = 1;</tt>
<tt> </tt><tt>else</tt>
<tt> </tt>
<tt> //ix vogal no inicio torna-se iz</tt>
<tt> if ((fonaux[i+2]=='a')||</tt>
<tt> (fonaux[i+2]=='i')||</tt>
<tt> (fonaux[i+2]=='o'))</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> </tt><tt>fonwrk[j+1] = 'Z';</tt>
<tt> j += 2;</tt>
<tt> i++;</tt>
<tt> </tt><tt>break;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> </tt>
<tt> //ix consoante no inicio torna-se is</tt>
<tt> </tt><tt>if (fonaux[i+2]=='C' || fonaux[i+2]=='s') {</tt>
<tt> fonwrk[j] = 'i';</tt>
<tt> j++;</tt>
<tt> i++;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> fonwrk[j+1] = 's';</tt>
<tt> j += 2;</tt>
<tt> i++;</tt>
<tt> break;</tt>
<tt> }//else</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'J': //se o caracter for J</tt>
<tt> </tt>
<tt> //J -> Gi</tt>
<tt> fonwrk[j] = 'G';</tt>
<tt> fonwrk[j+1] = 'i';</tt>
<tt> j += 2;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> </tt><tt>case 'K': //se o caracter for K</tt>
<tt> //KT -> T</tt>
<tt> if (fonaux[i+1] != 'T')</tt>
<tt> </tt><tt>copmud = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'L': //se o caracter for L</tt>
<tt> </tt>
<tt> </tt><tt>//L + vogal nao eh modificado</tt>
<tt> if ((fonaux[i+1] == 'a')||</tt>
<tt> (fonaux[i+1] == 'i')||</tt>
<tt> (fonaux[i+1] == 'o'))</tt>
<tt> copfon = 1;</tt>
<tt> else</tt>
<tt> </tt>
<tt> //L + consoante -> U + consoante</tt>
<tt> if (fonaux[i+1] != 'H')</tt>
<tt> </tt><tt>{ fonwrk[j] = 'o';</tt>
<tt> j++;</tt>
<tt> break;</tt>
<tt> </tt><tt>}//if</tt>
<tt> </tt>
<tt> //LH + consoante nao eh modificado</tt>
<tt> </tt><tt>else</tt>
<tt> if (fonaux[i+2] != 'a' &&</tt>
<tt> </tt><tt>fonaux[i+2] != 'i' &&</tt>
<tt> fonaux[i+2] != 'o')</tt>
<tt> copfon = 1;</tt>
<tt> else</tt>
<tt> </tt>
<tt> //LH + vogal -> LI + vogal</tt>
<tt> { fonwrk[j] = 'L';</tt>
<tt> </tt><tt>fonwrk[j+1] = 'i';</tt>
<tt> j += 2;</tt>
<tt> i++;</tt>
<tt> break;</tt>
<tt> }</tt>
<tt> break;</tt>
<tt> </tt>
<tt> </tt>
<tt> case 'M': //se o caracter for M</tt>
<tt> </tt>
<tt> </tt><tt>//M + consoante -> N + consoante</tt>
<tt> //M final -> N</tt>
<tt> if ((fonaux[i+1] != 'a' &&</tt>
<tt> fonaux[i+1] != 'i' &&</tt>
<tt> fonaux[i+1] != 'o') ||</tt>
<tt> </tt><tt>(fonaux[i+1] == ' '))</tt>
<tt> { fonwrk[j] = 'N';</tt>
<tt> j++;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> </tt><tt>//M nao eh alterado</tt>
<tt> else copfon = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'N': //se o caracter for N</tt>
<tt> </tt>
<tt> //NGT -> NT</tt>
<tt> if ((fonaux[i+1] == 'G') &&</tt>
<tt> (fonaux[i+2] == 'T'))</tt>
<tt> { fonaux[i+1] = 'N';</tt>
<tt> </tt><tt>copfon = 1;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> </tt>
<tt> //NH + consoante nao eh modificado</tt>
<tt> if (fonaux[i+1] == 'H')</tt>
<tt> if ((fonaux[i+2] != </tt><tt>'a')&&</tt>
<tt> (fonaux[i+2] != 'i')&&</tt>
<tt> (fonaux[i+2] != 'o'))</tt>
<tt> copfon = 1;</tt>
<tt> </tt>
<tt> //NH + vogal -> Ni + vogal</tt>
<tt> else</tt>
<tt> { fonwrk[j] = 'N';</tt>
<tt> fonwrk[j+1] = 'i';</tt>
<tt> </tt><tt>j += 2;</tt>
<tt> i++;</tt>
<tt> }</tt>
<tt> else copfon = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> </tt><tt>case 'o': //se o caracter for o</tt>
<tt> </tt>
<tt> //oS final -> o</tt>
<tt> //oZ final -> o</tt>
<tt> </tt><tt>if ((fonaux[i+1] == 's') ||</tt>
<tt> (fonaux[i+1] == 'Z'))</tt>
<tt> if (fonaux[i+2] == ' ')</tt>
<tt> { fonwrk[j] = 'o';</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> else copfon = 1;</tt>
<tt> else copfon = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'P': //se o caracter for P</tt>
<tt> </tt>
<tt> //PH -> F</tt>
<tt> if (fonaux[i+1] == 'H')</tt>
<tt> { fonwrk[j] = 'F';</tt>
<tt> i++;</tt>
<tt> newmud = 1;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> copmud = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'Q': //se o caracter for Q</tt>
<tt> </tt>
<tt> </tt><tt>//Koi -> Ki (QUE, QUI -> KE, KI)</tt>
<tt> </tt><tt>if (fonaux[i+1] == 'o')</tt>
<tt> if (fonaux[i+2] == 'i')</tt>
<tt> { fonwrk[j] = 'K';</tt>
<tt> j++;</tt>
<tt> i++;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //QoA -> KoA (QUA -> KUA)</tt>
<tt> fonwrk[j] = 'K';</tt>
<tt> j++;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> </tt><tt>case 'R': //se o caracter for R</tt>
<tt> </tt>
<tt> //R nao eh modificado</tt>
<tt> copfon = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 's': //se o caracter for s</tt>
<tt> </tt>
<tt> //s final eh ignorado</tt>
<tt> if (fonaux[i+1] == ' ')</tt>
<tt> break;</tt>
<tt> </tt>
<tt> //s inicial + vogal nao eh modificado</tt>
<tt> </tt><tt>if ((fonaux[i+1]=='a')||</tt>
<tt> (fonaux[i+1]=='i')||</tt>
<tt> (fonaux[i+1]=='o'))</tt>
<tt> if (i == 0)</tt>
<tt> </tt><tt>{ copfon = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> </tt>
<tt> //s entre duas vogais -> z</tt>
<tt> if ((fonaux[i-1] != 'a')&&</tt>
<tt> (fonaux[i-1]!='i')&&</tt>
<tt> (fonaux[i-1]!='o'))</tt>
<tt> </tt><tt>{ copfon = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> </tt>
<tt> //SoL nao eh modificado</tt>
<tt> if ((fonaux[i+1] == 'o') &&</tt>
<tt> (fonaux[i+2] == 'L') &&</tt>
<tt> (fonaux[i+3] == ' '))</tt>
<tt> { copfon = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> else</tt>
<tt> { fonwrk[j] = 'Z';</tt>
<tt> j++;</tt>
<tt> break;</tt>
<tt> }//else</tt>
<tt> </tt>
<tt> //ss -> s</tt>
<tt> if (fonaux[i+1] == 's')</tt>
<tt> if (fonaux[i+2] != ' ')</tt>
<tt> { copfon = 1;</tt>
<tt> i++;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> { fonaux[i+1] = ' ';</tt>
<tt> </tt><tt>break;</tt>
<tt> }//else</tt>
<tt> </tt>
<tt> //s inicial seguido de consoante fica precedido de i</tt>
<tt> //se nao for sci, sh ou sch nao seguido de vogal</tt>
<tt> </tt><tt>if (i == 0)</tt>
<tt> if (!((fonaux[i+1] == 'C') &&</tt>
<tt> </tt><tt>(fonaux[i+2] == 'i')))</tt>
<tt> if (fonaux[i+1] != 'H')</tt>
<tt> if (!((fonaux[i+1] == 'C') &&</tt>
<tt> (fonaux[i+2] == 'H') &&</tt>
<tt> ((fonaux[i+3] != 'a')&&</tt>
<tt> (fonaux[i+3]!='i')&&</tt>
<tt> (fonaux[i+3]!='o'))))</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> j++;</tt>
<tt> copfon = 1;</tt>
<tt> </tt><tt>break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //sH -> X;</tt>
<tt> if (fonaux[i+1] == 'H')</tt>
<tt> { fonwrk[j] = 'X';</tt>
<tt> i++;</tt>
<tt> newmud = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> if (fonaux[i+1] != </tt><tt>'C')</tt>
<tt> { copfon = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> // sCh nao seguido de i torna-se X</tt>
<tt> </tt><tt>if (fonaux[i+2] == 'H')</tt>
<tt> { fonwrk[j] = 'X';</tt>
<tt> i += 2;</tt>
<tt> newmud = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> if (fonaux[i+2] != </tt><tt>'i')</tt>
<tt> </tt><tt>{ copfon = 1;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //sCi final -> Xi</tt>
<tt> if (fonaux[i+3] == ' ')</tt>
<tt> { fonwrk[j] = 'X';</tt>
<tt> fonwrk[j+1] = 'i';</tt>
<tt> i = i + 3;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //sCi vogal -> X</tt>
<tt> if ((fonaux[i+3]=='a')||</tt>
<tt> (fonaux[i+3]=='i')||</tt>
<tt> (fonaux[i+3]=='o') )</tt>
<tt> { fonwrk[j] = 'X';</tt>
<tt> j++;</tt>
<tt> i += 2;</tt>
<tt> break;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //sCi consoante -> si</tt>
<tt> fonwrk[j] = 's';</tt>
<tt> fonwrk[j+1] = 'i';</tt>
<tt> j += 2;</tt>
<tt> i += 2;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'T': //se o caracter for T</tt>
<tt> </tt>
<tt> //TS -> S</tt>
<tt> if (fonaux[i+1] == 's')</tt>
<tt> break;</tt>
<tt> </tt>
<tt> //TZ -> Z</tt>
<tt> else</tt>
<tt> if (fonaux[i+1] == 'Z')</tt>
<tt> break;</tt>
<tt> else copmud = 1;</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'V': //se o caracter for V</tt>
<tt> </tt><tt>case 'W': //ou se o caracter for W</tt>
<tt> </tt>
<tt> //V,W inicial + vogal -> o + vogal (U + vogal)</tt>
<tt> </tt><tt>if (fonaux[i+1] == 'a'||</tt>
<tt> fonaux[i+1] == 'i'||</tt>
<tt> fonaux[i+1] == 'o')</tt>
<tt> if (i == 0)</tt>
<tt> </tt><tt>{ fonwrk[j] = 'o';</tt>
<tt> j++;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //V,W NAO inicial + vogal -> V + vogal</tt>
<tt> </tt><tt>else</tt>
<tt> { fonwrk[j] = 'V';</tt>
<tt> newmud = 1;</tt>
<tt> }//else</tt>
<tt> </tt>
<tt> else</tt>
<tt> { fonwrk[j] = 'V';</tt>
<tt> newmud = 1;</tt>
<tt> }//else</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'X': //se o caracter for X</tt>
<tt> </tt>
<tt> </tt><tt>//caracter nao eh modificado</tt>
<tt> copmud = 1;</tt>
<tt> </tt><tt>break;</tt>
<tt> </tt>
<tt> case 'Y': //se o caracter for Y</tt>
<tt> </tt><tt>//Y jah foi tratado acima</tt>
<tt> break;</tt>
<tt> </tt>
<tt> case 'Z': //se o caracter for Z</tt>
<tt> </tt>
<tt> //Z final eh eliminado</tt>
<tt> if (fonaux[i+1] == ' ')</tt>
<tt> break;</tt>
<tt> </tt>
<tt> //Z + vogal nao eh modificado</tt>
<tt> </tt><tt>else</tt>
<tt> if ((fonaux[i+1] == 'a')||</tt>
<tt> </tt><tt>(fonaux[i+1] == 'i')||</tt>
<tt> (fonaux[i+1] == 'o'))</tt>
<tt> copfon = 1;</tt>
<tt> </tt>
<tt> //Z + consoante -> S + consoante</tt>
<tt> else</tt>
<tt> </tt><tt>{ fonwrk[j] = 's';</tt>
<tt> j++;</tt>
<tt> }//else</tt>
<tt> break;</tt>
<tt> </tt>
<tt> </tt><tt>default: //se o caracter nao for um dos jah relacionados</tt>
<tt> </tt>
<tt> //o caracter nao eh modificado</tt>
<tt> fonwrk[j] = fonaux[i];</tt>
<tt> </tt><tt>j++;</tt>
<tt> break;</tt>
<tt> }//switch</tt>
<tt> </tt>
<tt> //copia caracter corrente</tt>
<tt> if (copfon == 1)</tt>
<tt> </tt><tt>{ fonwrk[j] = fonaux[i];</tt>
<tt> j++;</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> //insercao de i apos consoante muda</tt>
<tt> </tt><tt>if (copmud == 1)</tt>
<tt> fonwrk[j] = fonaux[i];</tt>
<tt> if (copmud == 1 || newmud == 1)</tt>
<tt> { j++;</tt>
<tt> k = 0;</tt>
<tt> while (k == 0)</tt>
<tt> if (fonaux[i+1] == ' ')</tt>
<tt> </tt><tt>//e final mudo</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> </tt><tt>k = 1;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> if ((fonaux[i+1]=='a')||</tt>
<tt> </tt><tt>(fonaux[i+1]=='i')||</tt>
<tt> (fonaux[i+1]=='o'))</tt>
<tt> </tt><tt>k = 1;</tt>
<tt> else</tt>
<tt> if (fonwrk[j-1] == 'X')</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> j++;</tt>
<tt> k = 1;</tt>
<tt> }//if</tt>
<tt> else</tt>
<tt> if (fonaux[i+1] == 'R')</tt>
<tt> k = 1;</tt>
<tt> else</tt>
<tt> if (fonaux[i+1] == 'L')</tt>
<tt> k = 1;</tt>
<tt> else</tt>
<tt> if (fonaux[i+1] != </tt><tt>'H')</tt>
<tt> { fonwrk[j] = 'i';</tt>
<tt> j++;</tt>
<tt> k = 1;</tt>
<tt> </tt><tt>}//if</tt>
<tt> else i++;</tt>
<tt> }</tt>
<tt> </tt>
<tt> }//for</tt>
<tt> }//if</tt>
<tt> }//else</tt>
<tt> </tt>
<tt> for (i = 0; i < component.elementAt(desloc).toString().length() + 3; i++)</tt>
<tt> </tt><tt>//percorre toda a palavra, letra a letra</tt>
<tt> </tt>
<tt> </tt><tt>//i -> I</tt>
<tt> if (fonwrk[i] == 'i')</tt>
<tt> fonwrk[i] = 'I';</tt>
<tt> else</tt>
<tt> </tt>
<tt> //a -> A</tt>
<tt> if (fonwrk[i] == 'a')</tt>
<tt> fonwrk[i] = 'A';</tt>
<tt> else</tt>
<tt> </tt>
<tt> //o -> U</tt>
<tt> if (fonwrk[i] == 'o')</tt>
<tt> fonwrk[i] = 'U';</tt>
<tt> else</tt>
<tt> </tt>
<tt> //s -> S</tt>
<tt> if (fonwrk[i] == 's')</tt>
<tt> fonwrk[i] = 'S';</tt>
<tt> else</tt>
<tt> </tt>
<tt> //E -> b</tt>
<tt> if (fonwrk[i] == 'E')</tt>
<tt> fonwrk[i] = ' ';</tt>
<tt> else</tt>
<tt> </tt>
<tt> //Y -> _</tt>
<tt> if (fonwrk[i] == 'Y')</tt>
<tt> fonwrk[i] = '_';</tt>
<tt> </tt>
<tt> </tt><tt>//retorna a palavra, modificada, ao vetor que contem o texto</tt>
<tt> component.setElementAt(str.copyValueOf(fonwrk), desloc);</tt>
<tt> j = 0; //zera o contador</tt>
<tt> }//for</tt>
<tt> </tt>
<tt> str = vectorToStr(component);</tt>
<tt> //remonta as palavras armazenadas no vetor em um unico string</tt>
<tt> </tt>
<tt> str = removeMultiple(str);</tt>
<tt> //remove os caracteres duplicados</tt>
<tt> </tt>
<tt> </tt><tt>return str.toUpperCase().trim();</tt>
<tt> }</tt>
<tt> </tt>
<tt> </tt>
<tt> </tt>
<tt> public static String removePrep(String str) {</tt>
<tt> </tt><tt>int i,j;</tt>
<tt> Vector palavra = new Vector();</tt>
<tt> palavra = strToVector(str);</tt>
<tt> String prep[] = {"DEL","DA","DE","DI","DO","DU","DAS","DOS","DEU","DER","E","LA","LE","LES","LOS","VAN","VON","EL"};</tt>
<tt> </tt>
<tt> </tt><tt>for (i = 0; i < palavra.size(); i++) {</tt>
<tt> for (j = 0; j < prep.length; j++) {</tt>
<tt> </tt><tt>if (palavra.elementAt(i).toString().compareTo(prep[j]) == 0) {</tt>
<tt> palavra.removeElementAt(i); </tt>
<tt> i--;</tt>
<tt> }</tt>
<tt> }</tt>
<tt> }</tt>
<tt> return vectorToStr(palavra);</tt>
<tt> </tt><tt>}</tt>
<tt> </tt>
<tt> </tt>
<tt> public static String removeMultiple (String str) {</tt>
<tt> </tt><tt>//Retira do texto carateres que estao multiplicados:</tt>
<tt> // ss -> s, sss -> s, rr -> r</tt>
<tt> </tt>
<tt> char[] foncmp = new char[256];</tt>
<tt> //matriz de caracteres que armazena o texto sem duplicatas</tt>
<tt> </tt>
<tt> char[] fonaux = new char[256];</tt>
<tt> //matriz de caracteres que armazena o texto original</tt>
<tt> </tt>
<tt> char[] tip = new char[1]; //armazena o caracter anterior</tt>
<tt> </tt>
<tt> int i, j; //contadores</tt>
<tt> </tt>
<tt> j = 0;</tt>
<tt> tip[0] = ' ';</tt>
<tt> fonaux = str.toCharArray();</tt>
<tt> //a matriz de caracteres recebe o string original</tt>
<tt> </tt>
<tt> </tt><tt>for (i = 0; i < str.length(); i++) {</tt>
<tt> </tt><tt>//percorre o texto, caracter a caracter</tt>
<tt> </tt>
<tt> //elimina o caracter se ele for duplicata e</tt>
<tt> //nao for numero, espaco ou S</tt>
<tt> if ((fonaux[i] != tip[0]) || (fonaux[i] == ' ')</tt>
<tt> ||((fonaux[i]>='0') && (fonaux[i]<='9'))</tt>
<tt> ||((fonaux[i]=='S')&&(fonaux[i-1]=='S')&&</tt>
<tt> ( (i>1) && (fonaux[i-2]!='S')))) {</tt>
<tt> foncmp[j] = fonaux[i];</tt>
<tt> j++;</tt>
<tt> }</tt>
<tt> </tt>
<tt> tip[0] = fonaux[i];</tt>
<tt> //reajusta o caracter de comparacao</tt>
<tt> }</tt>
<tt> </tt>
<tt> //o string recebe o texto sem duplicatas</tt>
<tt> </tt><tt>str = str.copyValueOf(foncmp);</tt>
<tt> </tt>
<tt> return str.trim();</tt>
<tt> }//removeMultiple</tt>
<tt> </tt>
<tt> </tt>
<tt> public static String removeAccentuation (String str) {</tt>
<tt> </tt><tt>//Substitui os caracteres acentuados por caracteres nao acentuados</tt>
<tt> </tt>
<tt> char aux[] = new char[256];</tt>
<tt> //matriz de caracteres onde o texto eh manipulado</tt>
<tt> </tt>
<tt> int i; //contador</tt>
<tt> </tt>
<tt> aux = str.toCharArray();</tt>
<tt> //matriz recebe o texto</tt>
<tt> </tt>
<tt> for (i = 0; i < str.length(); i++) {</tt>
<tt> //percorre o texto, caracter a caracter</tt>
<tt> </tt>
<tt> </tt><tt>switch (aux[i])</tt>
<tt> { case 'É':</tt>
<tt> </tt><tt>aux[i]='E'; //É -> E</tt>
<tt> break;</tt>
<tt> </tt><tt>case 'Ê':</tt>
<tt> aux[i]='E'; //Ê -> E</tt>
<tt> break;</tt>
<tt> case 'Ë':</tt>
<tt> aux[i]='E'; //Ë -> E</tt>
<tt> break;</tt>
<tt> </tt><tt>case 'Á':</tt>
<tt> aux[i]='A'; //Á -> A</tt>
<tt> </tt><tt>break;</tt>
<tt> case 'À':</tt>
<tt> aux[i]='A'; //À -> A</tt>
<tt> break;</tt>
<tt> case 'Â':</tt>
<tt> aux[i]='A'; //Â -> A</tt>
<tt> break;</tt>
<tt> case 'Ã':</tt>
<tt> aux[i]='A'; //Ã -> A</tt>
<tt> break;</tt>
<tt> case 'Ä':</tt>
<tt> aux[i]='A'; //Ä -> A</tt>
<tt> break;</tt>
<tt> case 'Ç':</tt>
<tt> aux[i]='C'; //Ç -> C</tt>
<tt> break;</tt>
<tt> case 'Í':</tt>
<tt> aux[i]='I'; //Í -> I</tt>
<tt> break;</tt>
<tt> case 'Ó':</tt>
<tt> aux[i]='O'; //Ó -> O</tt>
<tt> break;</tt>
<tt> case 'Õ':</tt>
<tt> aux[i]='O'; //Õ -> O</tt>
<tt> break;</tt>
<tt> case 'Ô':</tt>
<tt> aux[i]='O'; //Ô -> O</tt>
<tt> break;</tt>
<tt> case 'Ö':</tt>
<tt> aux[i]='O'; //Ö -> O</tt>
<tt> break;</tt>
<tt> case 'Ú':</tt>
<tt> aux[i]='U'; //Ú -> U</tt>
<tt> break;</tt>
<tt> case 'Ü':</tt>
<tt> aux[i]='U'; //Ü -> U</tt>
<tt> break;</tt>
<tt> case 'Ñ':</tt>
<tt> aux[i]='N'; //Ñ -> N</tt>
<tt> break;</tt>
<tt> }</tt>
<tt> }</tt>
<tt> str = str.copyValueOf(aux).trim();</tt>
<tt> </tt><tt>//o string recebe o texto sem acentuacao</tt>
<tt> </tt>
<tt> </tt><tt>return str;</tt>
<tt> }//removeAccentuation</tt>
<tt> </tt>
<tt> public static String removeStrange (String str) {</tt>
<tt> </tt><tt>//Elimina os caracteres que NAO sejam alfanumericos ou espacos</tt>
<tt> </tt>
<tt> char[] foncmp = new char[256];</tt>
<tt> //matriz de caracteres que armazena o texto original</tt>
<tt> </tt>
<tt> char[] fonaux = new char[256];</tt>
<tt> //matriz de caracteres que armazena o texto modificado</tt>
<tt> </tt>
<tt> int i, j, //contadores</tt>
<tt> first; //indica se exitem espacos em branco antes do primeiro</tt>
<tt> //caracter: se 1 -> existem, se 0 -> nao existem</tt>
<tt> </tt>
<tt> </tt><tt>j = 0;</tt>
<tt> first = 1;</tt>
<tt> fonaux = str.toCharArray();</tt>
<tt> </tt><tt>//matriz de caracteres recebe o texto</tt>
<tt> </tt>
<tt> </tt><tt>for (i = 0; i < 256; i++)</tt>
<tt> foncmp[i] = ' ';</tt>
<tt> </tt><tt>//branqueia a matriz de caracteres</tt>
<tt> </tt>
<tt> for (i = 0; i < str.length(); i++) {</tt>
<tt> //percorre o texto, caracter a caracter</tt>
<tt> </tt>
<tt> //elimina os caracteres que nao forem alfanumericos ou espacos</tt>
<tt> if (((fonaux[i]>='A')&&</tt>
<tt> (fonaux[i]<='Z')) ||</tt>
<tt> ((fonaux[i]>='a')&&</tt>
<tt> (fonaux[i]<='z')) ||</tt>
<tt> ((fonaux[i]>='0')&&</tt>
<tt> (fonaux[i]<='9')) ||</tt>
<tt> (fonaux[i] == '&') ||</tt>
<tt> (fonaux[i] == '_') ||</tt>
<tt> ((fonaux[i] == ' ') && first == 0)) {</tt>
<tt> foncmp[j] = fonaux[i];</tt>
<tt> </tt><tt>j++;</tt>
<tt> first = 0;</tt>
<tt> }//if</tt>
<tt> }//for</tt>
<tt> str = str.valueOf(foncmp);</tt>
<tt> </tt><tt>//string recebe o texto da matriz de caracteres</tt>
<tt> </tt>
<tt> </tt><tt>return str.trim();</tt>
<tt> }//removeStrange</tt>
<tt> </tt>
<tt> </tt>
<tt> public static Vector strToVector(String str) {</tt>
<tt> </tt><tt>//armazena o texto de um string em um vetor onde</tt>
<tt> //cada palavra do texto ocupa uma posicao do vetor</tt>
<tt> </tt>
<tt> </tt><tt>str = str.trim();</tt>
<tt> </tt>
<tt> char[] fonaux = new char[256];</tt>
<tt> </tt><tt>//matriz de caracteres que armazena o texto completo</tt>
<tt> </tt>
<tt> char[] foncmp = new char[256];</tt>
<tt> //matriz de caracteres que armazena cada palavra</tt>
<tt> </tt>
<tt> Vector component = new Vector();</tt>
<tt> //vetor que armazena o texto</tt>
<tt> </tt>
<tt> </tt><tt>String aux = new String();</tt>
<tt> </tt>
<tt> int i, j, //contadores</tt>
<tt> </tt><tt>pos, //posicao da matriz</tt>
<tt> rep, //indica se eh espaco em branco repetido</tt>
<tt> first; //indica se eh o primeiro caracter</tt>
<tt> </tt>
<tt> </tt><tt>first = 1;</tt>
<tt> pos = 0;</tt>
<tt> rep = 0;</tt>
<tt> </tt>
<tt> fonaux = str.toCharArray();</tt>
<tt> </tt><tt>//matriz de caracteres recebe o texto</tt>
<tt> </tt>
<tt> </tt><tt>for (j = 0; j < 256; j++)</tt>
<tt> foncmp[j] = ' ';</tt>
<tt> </tt><tt>//branqueia matriz de caracteres</tt>
<tt> </tt>
<tt> for (i = 0; i < str.length(); i++) {</tt>
<tt> //percorre o texto, caracter a caracter</tt>
<tt> </tt>
<tt> //se encontrar um espaco e nao for o primeiro caracter,</tt>
<tt> //armazena a palavra no vetor</tt>
<tt> if ((fonaux[i] == ' ') && (first != 1)) {</tt>
<tt> </tt><tt>if (rep == 0) {</tt>
<tt> component.addElement(aux.copyValueOf(foncmp).trim());</tt>
<tt> pos = 0;</tt>
<tt> rep = 1;</tt>
<tt> for (j = 0; j < 256; j++)</tt>
<tt> foncmp[j] = ' ';</tt>
<tt> }//if</tt>
<tt> }//if</tt>
<tt> </tt>
<tt> </tt><tt>//forma a palavra, letra a letra, antes de envia-la a uma</tt>
<tt> //posicao do vetor</tt>
<tt> else {</tt>
<tt> foncmp[pos] = fonaux[i];</tt>
<tt> </tt><tt>first = 0;</tt>
<tt> pos++;</tt>
<tt> rep = 0;</tt>
<tt> }//else</tt>
<tt> }//for</tt>
<tt> </tt>
<tt> if (foncmp[0] != </tt><tt>' ')</tt>
<tt> </tt><tt>component.addElement(aux.copyValueOf(foncmp).trim());</tt>
<tt> </tt>
<tt> return component;</tt>
<tt> }//strToVector</tt>
<tt> </tt>
<tt> </tt>
<tt> public static String vectorToStr(Vector vtr) {</tt>
<tt> </tt><tt>//converte o texto armazenado em um vetor para um unico string</tt>
<tt> </tt>
<tt> char[] foncmp = new char[256];</tt>
<tt> //matriz de caracteres que armazena o texto completo</tt>
<tt> </tt>
<tt> char[] auxChar = new char[256];</tt>
<tt> //matriz de caracteres que armazena cada palavra</tt>
<tt> </tt>
<tt> </tt><tt>String auxStr = new String();</tt>
<tt> String str = new String();</tt>
<tt> </tt><tt>int i, j, desloc;</tt>
<tt> </tt>
<tt> desloc = 0; //deslocamento dentro da matriz</tt>
<tt> </tt>
<tt> </tt><tt>for (i = 0; i < 256; i ++)</tt>
<tt> foncmp[i] = ' ';</tt>
<tt> </tt><tt>//branqueia a matriz de caracteres</tt>
<tt> </tt>
<tt> for (j = 0; j < vtr.size(); j++) {</tt>
<tt> //percorre o vetor, palavra a palavra</tt>
<tt> </tt>
<tt> auxStr = (vtr.elementAt(j)).toString().trim();</tt>
<tt> //string recebe a palavra armazenada pelo vetor</tt>
<tt> </tt>
<tt> auxChar = auxStr.toCharArray();</tt>
<tt> //matriz de caracteres recebe a palavra armazenada no vetor</tt>
<tt> </tt>
<tt> </tt><tt>for (i = 0; i < auxStr.length(); i++)</tt>
<tt> </tt><tt>//percorre a matriz, caracter a caracter</tt>
<tt> </tt>
<tt> foncmp[desloc + i] = auxChar[i];</tt>
<tt> desloc = desloc + auxStr.length() + 1;</tt>
<tt> }//for</tt>
<tt> </tt>
<tt> str = str.valueOf(foncmp);</tt>
<tt> //string recebe o texto completo</tt>
<tt> </tt>
<tt> return str.trim();</tt>
<tt> </tt>
<tt> </tt><tt>}//vectorToStr</tt>
<tt>}</tt>
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo