Verificador lexico

boa tarde a todos, eu to precisando de ajuda aqui…

eu to tentando implementa um lexico aqui, e to comcertos problemas…

o que acontece é o seguinte:

eu peço uma frase por JOptionPane (ao menos por enquanto, pra testa de forma pratica, alterando facil a string pra testar mtas diferentes)

eu pego essa frase e separo elas por palavras, jogando cada palavra dessa frase em um espaço dentro do arrayList (isso ta funcionano)

ok…ai eu kero depois disso varrer o arraylist e ver se cada uma dessas palavras também contem dentro de um outro ArrayList, e avisa caso alguma palavra não contenha.

exemplo: eu pego as palavras e jogo no array token, depois eu verifico se cada uma delas tem tb dentro do array palavra, pra poder avisa caso esse token nao exista dentro do otro array.

o problema é que certas palavras que eu to digitando não ta reconhecendo

segue o codigo:

import javax.swing.JOptionPane;
import java.util.ArrayList;
public class Teste {
    
    /** Creates a new instance of Teste */
    public Teste() {
    }
    public static void main (String args[]){
        
        int comecoT=0, tamanhoFrase=0;
        boolean comT=false, resultado=false;
        ArrayList<String> palavra = new ArrayList();
        ArrayList<String> token = new ArrayList();
        String saida="";
        
        palavra.add("pa1");
        palavra.add("pa2");
        palavra.add("pa3");
        palavra.add("pa4");
        palavra.add("pa5");
        
        String frase=JOptionPane.showInputDialog("digite a frase: ");
        
        for (int i=0;i<frase.length();i++){
            if (comT==false){
                if (!frase.substring(i, i+1).equals(" ")){
                    comecoT=i;
                    comT=true;
                }   
            //se cair no else é pq ja começo o token, começa a le-lo    
            }else{
                
                //esse if serve pra descobrir que o token acabou (encontrando espaço
                //no final do token ou o proprio final da frase, e coloca o token
                //dentro do arrayList token, depois diz aonde começa o proximo token e 
                //reseta a comecotoken pra nao pega token enquanto nao ver o começo dele
                if (frase.substring(i, i+1).equals(" ")||i==frase.length()-1){
                    token.add(frase.substring(comecoT, i+1));
                     comecoT=i+1;
                     comT=false;
                }
            }
        }
           
        //só pra demonstrar que separo ok os tokens da frase
        for (int i=0;i<token.size();i++){
            System.out.println(token.get(i));
        }

// até aqui funciona normal, o problema é daki pra baixo que compara se o token tem no array palavra
                
        for (int i=0;i<token.size();i++){

            resultado=false;
            for (int j=0;j<palavra.size();j++){
                if (token.get(i).equals(palavra.get(j))){
                    resultado=true;
                    break;
                }
            }
            
            if (resultado==false){
                saida+="não foi reconhecida a palavra "+token.get(i)+"\n";
            }
            
        }
        
        if (!saida.equals("")){
            JOptionPane.showMessageDialog(null, saida);
        }
              
    }
    
}

tem como alguem ai me ajuda???

Olá maior_abandonado,

Bom, particularmente achei a sua solução um tanto complexa ou não entendi bem o que você está precisando. Tente deixa-lá mais simples.

Por exemplo você pode usar o método split da classe String para quebrar a frase em um array por espaço ou utilizar a classe StringTokenizer ao invés de substring.

Na interface List tem o método removeAll que pode ser aplicado ao seu exemplo, pois após você preencher as duas listas e quiser saber as palavras existentes no “token” e que não existem no “palavra” basta vc fazer:

token.removeAll(palavra);

Se por algum motivo você precisar manter a coleção original faz um clone dela para outra lista.

No seu exemplo algumas palavras não eram encontradas. Está sendo considerado upper/lower case? Será que alguma palavra não está sendo gravada com o espaço?

Espero que as dicas ajudem.

Um abraço.

galera…consegui aki…

nao tava reconhecendo as palavras pq ao pegar elas, eu pegava tb o espaço do final delas…

tive que mudar as linhas 38 e 39 para :

if (frase.substring(i, i+1).equals(" ")){ token.add(frase.substring(comecoT, i));

na linha 45 eu inclui mais 2 linha, pq nao tava pegando direito o ultimo token (ja q eu tirei a parte q fazia isso)

    if (!(comecoT==frase.length()))
        token.add(frase.substring(comecoT));

agora ta funcionano de boa…

galera…consegui aki…

nao tava reconhecendo as palavras pq ao pegar elas, eu pegava tb o espaço do final delas…

tive que mudar as linhas 38 e 39 para :

if (frase.substring(i, i+1).equals(" ")){ token.add(frase.substring(comecoT, i));

na linha 45 eu inclui mais 2 linha, pq nao tava pegando direito o ultimo token (ja q eu tirei a parte q fazia isso)

    if (!(comecoT==frase.length()))
        token.add(frase.substring(comecoT));

agora ta funcionano de boa…

sim…tava sendo gravada com o espaço…

desculpem a duplicação do post…a net aki ta ruim, eu cliquei 2 vezes…

obrigado pelas dicas kra… eu ja tinha ouvido fala q tinha metodo que separava a string por tokens entre espaços, mais eu quero eu mesmo cria a logica (afinal de contas… é ai q o bicho pega…rs)

isso ai é pra um projeto que servirá de TCC, sendo assim to kerendo eu mesmo cria o q depender de logica e nao usa metodos que ja façam o trabalho pro mim…

obrigado ae os toque kra…vlw