1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajudem por favor

Discussão em 'Programação' iniciada por araqh, 5 de Junho de 2009. (Respostas: 0; Visualizações: 545)

  1. Olá,
    Preciso da vossa ajuda:confused:
    Trata-se de uma árvore de letras, mas sem Jtree, é tudo feito no array.
    A ideia é regrupar as palavras numa árvore na qual cada arco representa uma letra. Uma palavra seria então representada pelo caminho da raíz até ao nó que contem o valor "fimPalavra".
    Na verdade trata-se de uma maneira comptacta de representar um conjunto de palavras, como um dicionario por exemplo.

    Estou com dificuldades em criar os metodos contemPalavra e acrescentarPalavra. Depois utilizar a classe para construir uma árvore de letras a partir de um ficheiro de texto. Por fim, ler o ficheiro e mostrar todas as palavras que não se encontrem na árvore construida a partir do primeiro ficheiro.

    O primeiro ficheiro serve para construir a árvore, ele lê o ficheiro palavra a palavra e percorre cada palavra letra a letra para então construir a árvore. (p.acrescentarPalavra(palavra.toLowerCase())).

    Depois o segundo, serve como disseste para comparar à árvore construida com o primeiro ficheiro. Para cada palavra deste segundo ficheiro chama-se o metodo contemPalavra e retorna true se pertence ao lexico(p.contemPalavra(palavra.toLowerCase())) .

    Em relação à instância, é suposta indicar o primeiro caracter e o arraylist uma lista dos caracteres seguintes. No main só tem para palavras começadas por « A », que será a raíz. A partir daí imensas palavras podem se formar, só que neste caso todas começarão por A.
    Por exemplo se eu substituir A por S e tiver 4 palavras:
    Sol
    sair
    soma
    somas

    Daria isto:
    A* I* R°
    *
    S* O* L °
    *
    M
    *
    A
    °
    S
    °

    Imaginem que as letras estao sobre os arcos, o * é um nó e o ° representa o nó de fim de palavra.

    É na criação destes 2 metodos (acrescentarPalavra e contemPalavra) que estou a ter dificuldades. Para o resto, não tenho problemas.

    O principio é o mesmo para os dois metodos, só que um vai acrescentar a palavra e o outro vai retornar um boolean.

    Parece que a solução mais simples é utilizar os metodos contemLetra e getSubArvore numa chamada recursiva para os dois metodos contemPalavra e acrescentarPalavra.
    Só que....bloqueio total, até agora ainda não consegui.

    Se alguem me puder ajudar, agradecia.


    Aqui vai o meu codigo:

    Código:
     
    import java.io.*; 
    import java.util.*; 
    
    public class ArvoreLetra
    { 
       char letra; 
       boolean fimPalavra; 
       ArrayList letrasSeguintes; 
        
    /* constructor */ 
       ArvoreLetra(char c)
       { 
          letra = c; 
          fimPalavra = false; 
          letrasSeguintes = new ArrayList(); 
       }
       
       
       /* permite modificar a variável fimPalavra 
       para indicar se uma subArvore corresponde ou não ao fim de uma palavra*/ 
       void setFimPalavra(boolean b)
       { 
          fimPalavra = b; 
       }
       
       
       /*testa si a árvore corresponde ao fim de uma palavra, ultima letra*/ 
       boolean isFimDePalavra()
       { 
          return fimPalavra; 
       }
       
       
       /* testa se o caractere c é uma das letras a seguir à letra corrente */ 
       boolean contemLetra(char c)
       { 
          for (int i=0; i<letrasSeguintes.size(); i++)
          { 
             ArvoreLetra a = (ArvoreLetra)letrasSeguintes.get(i); 
             if (a.letra == c) return true; 
          } 
          return false; 
       }
    
       
       /* retorna a subArvore (letra seguinte) que corresponde ao caractere c */ 
       ArvoreLetra getSubArvore(char c)
       { 
          for (int i=0; i<letrasSeguintes.size();i++)
          { 
             ArvoreLetra a = (ArvoreLetra)letrasSeguintes.get(i); 
             if (a.letra == c) return a; 
          } 
          return null; 
       }
    
       
    
       /*void acrescentarPalavra(String palavra)
       { 
           
       }
    
       
       boolean contemPalavra(String palavra)
       { 
           
       }*/
    
    /* leitura du ficheiro, construção da árvore e verificação */ 
        public static void main(String[] args)
        {
            String ficheiro ="test.txt";
            String ficheiro1 = "test1.txt";
            String palavra, lin;
            StringTokenizer linhaToken;
           
            ArvoreLetr p;
            p = new ArvoreLetra('A');
            System.out.println("OK!");
            
            //leitura do ficheiro de texto         
            try
            {
                InputStream input = new FileInputStream(ficheiro);
                InputStreamReader streamReader = new InputStreamReader(input);
                BufferedReader br = new BufferedReader(streamReader);
               
                while ((lin = br.readLine())!=null)
                {
                    System.out.println("Ok!!");
                    linhaToken = new StringTokenizer(lin);
                    
                    while (linhaToken.hasMoreTokens())
                    {
                        System.out.println("OK!!");
                        palavra = (linhaToken.nextToken());
                        
                        System.out.println(palavra);
                        p.acrescentarPalavra(palavra.toLowerCase());          
                    }          
                }
            br.close();
            }
            catch (Exception e)
            {
            }
            
            //pesquisa  no ficheiro de texto         
            try
            {
                InputStream input = new FileInputStream(ficheiro1);
                InputStreamReader streamReader = new InputStreamReader(input);
                BufferedReader br = new BufferedReader(streamReader);
                
                while ((lin = br.readLine())!=null)
                {
                    System.out.println("Ok!!");
                    linhaToken = new StringTokenizer(lin);
                  
                    while (linhaToken.hasMoreTokens())
                    {
                        System.out.println("OK!!");
                        palavra = (linhaToken.nextToken());
                        System.out.println(palavra);
                       
                        if(p.contemPalavra(palavra.toLowerCase()))
                            System.out.println("Ok!! Palavra encontrada : "+palavra);
                        else
                            System.out.println("Palavra nao encontrada : "+palavra);
                    }             
                }
            br.close();
            }
            catch (Exception e)
            {
            }
        }
    }
    
    Obrigado.
     
    Última edição: 5 de Junho de 2009

Partilhar esta Página