Problemas ao colocar Objetos numa ArrayList

17 respostas
T

Então pessoal, o que eu tenho que fazer é pegar um arquivo .txt e ler uns elementos especificos igorando partes da entrada.

tipo assim:
s0 -- a/0 -> s1
s0 -- b/1 -> s2
s1 -- a/0 -> s2
s1 -- b/0 -> s1
s2 -- a/1 -> s0
s2 -- b/0 -> s1

criei uma classe assim:
public static class Transicao{
        public String  inicial;
        public char    entrada;
        public char    saida;
        public String  proximo;


    }

Em que cada um representa uma posição da linha.

criei uma lista para armazenar as linhas desses dados em separado:
ArrayList<Transicao> Lista = new ArrayList<Transicao>();
      tran = new Transicao();
depois de com uma lógica separar os elementos eu coloco na lista assim:
if(cont == 6){
              temp = new Transicao();
              temp = tran;
              Lista.add(temp);
            }

Acontece que no final da interação, toda a lista fica preenchida igual, com o ultimo elemento
Estado inicial = s2 Entrada = b Saida = 0 Estado Final = s1
Estado inicial = s2 Entrada = b Saida = 0 Estado Final = s1
Estado inicial = s2 Entrada = b Saida = 0 Estado Final = s1
Estado inicial = s2 Entrada = b Saida = 0 Estado Final = s1
Estado inicial = s2 Entrada = b Saida = 0 Estado Final = s1
Estado inicial = s2 Entrada = b Saida = 0 Estado Final = s1

sendo que o correto seria assim:
Estado inicial = s0 Entrada = a Saida = 0 Estado Final = s1
Estado inicial = s0 Entrada = b Saida = 1 Estado Final = s2
Estado inicial = s1 Entrada = a Saida = 0 Estado Final = s2
Estado inicial = s1 Entrada = b Saida = 0 Estado Final = s1
Estado inicial = s2 Entrada = a Saida = 1 Estado Final = s0
Estado inicial = s2 Entrada = b Saida = 0 Estado Final = s1

Já tentei de tudo, e depurando percebi que toda vez que o objeto é alterado todos os elementos da lista ficam são alterados juntos.
Alguma idéia?

Aqui o codigo total.
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package metodow_bpt;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


/**
 *
 * @author thadeu-afm
 */
public class Main {
    
        public static class Transicao{
        public String  inicial;
        public char    entrada;
        public char    saida;
        public String  proximo;


    }

  

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException, IOException {

        //if(args.length<=0){
           // System.out.println("No input file");
           // System.exit(0);
       // }
        //String namefile;
        //namefile = args[1];
        Transicao tran;
        Transicao test;
        Transicao temp;
      

     FileReader fr = new FileReader("fsm.txt");

       int ch, cont= 0;
       cont=0;
       String p = "";
      ArrayList<Transicao> Lista = new ArrayList<Transicao>();
      tran = new Transicao();
     
       do {
        ch = fr.read();       
        if(ch != '\n'){
        if((ch !=' ')&&(ch !='-')&&(ch != '/')&&(ch != '>')){
            
            p = p + (char)ch;
            if(cont == 1){
              tran.inicial = p;
              p = "";
            }
            if(cont == 2){
                tran.entrada = (char)ch;
                p = "";
            }
            if(cont == 3){
                tran.saida = (char)ch;
                p = "";
            }
            if(cont == 5 ){
                tran.proximo = p;
                p = "";
            }
            if(cont == 6){
              temp = new Transicao();
              temp = tran;
              Lista.add(temp);
              System.out.println("Estado inicial = " + tran.inicial + " Entrada = " + tran.entrada + " Saida = " + tran.saida + " Estado Final =  " + tran.proximo);
            }

        cont++;
        } 
        
        }
        if((ch == '\n')||(ch == -1)){
            
         
            cont = 0;
           
        }
       
        } while (ch != -1);
        fr.close();
        int i;
        
        for(i = 0; i < Lista.size(); i++){
           test = new Transicao();
           test = Lista.get(i);
           //System.out.println(i);
           System.out.println("Estado inicial = " + test.inicial + " Entrada = " + test.entrada + " Saida = " + test.saida + " Estado Final =  " + test.proximo);
        
        }
        
    }

}

17 Respostas

claudneto

Vc está incrementando corretamente?

Não li o código inteiro, mas, quando os dados ficam todos iguais, verifique o incremento pra ir pro próximo elemento.

T

Então, já verifiquei que a lista crece na ordem correta.

Antes eu nao estava usando um objeto temporario, mas mesmo assim o erro era exatamente igual.
toda vez que um novo elemento é colocado os outros anteriores mudam também, mesmo que seja uma parte do objeto.

claudneto

Mas vc tá jogando os valores no mesmo objeto ou tá criando um novo pra cada iteração?

Se for o mesmo, ao imprimir no final, ele imprimirá a mesma coisa sempre, pois é o mesmo objeto.

T

claudneto:
Mas vc tá jogando os valores no mesmo objeto ou tá criando um novo pra cada iteração?

Se for o mesmo, ao imprimir no final, ele imprimirá a mesma coisa sempre, pois é o mesmo objeto.

Foi isso que me falaram, mas eu já tentei criar um novo temporario para cada vez que a lista vai ser atualizada.
Mas continua na mesma.
Veja.

if(cont == 6){ temp = new Transicao(); temp = tran; Lista.add(temp); }

claudneto

Tenta jogar isso num array pra ver.

Cada vez que mudar o temp, vc joga num indice diferente do vetor. Ai, roda o vetor imprimindo as informações dos objetos.

Criando o temp várias vezes, se não me engano, vc perde as informações anteriores tbm, já que a referência ao temp será a do último elemento alterado.

T

claudneto:
Tenta jogar isso num array pra ver.

Cada vez que mudar o temp, vc joga num indice diferente do vetor. Ai, roda o vetor imprimindo as informações dos objetos.

Criando o temp várias vezes, se não me engano, vc perde as informações anteriores tbm, já que a referência ao temp será a do último elemento alterado.

Vc fala em criar mesmo? Não apenas estanciar o objeto?

claudneto

Deixa desse jeito mesmo, mas, quando jogar as informações no temp, antes de incrementar, joga o temp em um vetor.

Ai, imprime as infos dos objetos do vetor, índice por índice pra ver.

T

Eu já tentei até mesmo mudar o add por indice.

Mas nada funciona, sempre que eu mudo a estrutura temporaria muda os outros elementos na lista.

T
inacreditavel, mudei para um vetor simples e a situação continua a mesma. o vetor fica preenchido com todos os dados iguais da ultima interação
if(cont == 6){
              vet[j] = tran;
              j++;
              //Lista.add(tran);
            }
e depois para imprimir:
for(i = 0; i < vet.length; i++){
           Transicao test = new Transicao();
           //test = Lista.get(i);
           //System.out.println(i);
           //System.out.println("Estado inicial = " + test.inicial + " Entrada = " + test.entrada + " Saida = " + test.saida + " Estado Final =  " + test.proximo);
           System.out.println("Estado inicial = " + vet[i].inicial + " Entrada = " + vet[i].entrada + " Saida = " + vet[i].saida + " Estado Final =  " + vet[i].proximo);

        }
nel

Bom dia!
Com certeza, o problema é referente a forma como está alocando um objeto.

E assim, você adiciona uma instancia a uma determinada lista, se esta instancia sofrer alteração, a mesma instancia já adicionada a lista sofrerá as mesmas alterações, portanto, fique atento a isso.

Ao invés do vetor simples aconselho a usar o List mesmo, e por favor, poste o seu código completo, linha a linha.
Fica mais fácil de ajudarmos você.

Abraços.

claudneto

nel, eu pedi pra ele colocar em um vetor apenas pra testar.

ThadeuMelo, coloque um print.ln cada vez que atribuir um valor a um objeto dizendo qual é o objeto (coloca um atributo nome só pra identificar) e o que está atribuindo. Assim vc saberá em qual objeto ele está atribuindo o valor. (Cada iteração, mude o nome pra diferenciar um do outro).

Lucas_Abbatepaolo

como nel falou ai em cima…vc esta alterando baseado na mesma referencia, consequente mente vc altera todos os objetos …pq?

vc instancia no começo do seu codigo

tran = new Transicao();

depois vc entra no loop do, altera os valores, passa para uma varialvel temp (o que é desnecessario, por mais q vc instancia o tem la, vc esta passando a referencia de tran)
e adiciona a lista. Quando seu loop é executado novamente vc altera os valores da referencia tran, sendo assim vc altera as referencia ja existentes na lista.

Não sei se fui claro, mais para resolver seu problema é so vc colocar

tran = new Transicao();

dentro do seu loop do

nel

Exatamente, por isso pedi para adicionar o código completo.
Você deve criar um novo objeto temp e não faze-lo receber a referência de um já existente.

Crie um novo objeto tempo, faça um set com os valores que deseja e depois adicione a lista, assim, não vai ocorrer alteração no seu objeto principal.
Abraços!

nel

wellington.nogueira:
Tente isso:

if(cont == 6){ temp = new Transicao(); // temp = tran; --> Essa linha NÃO pode existir Lista.add(temp); }

ou isso

if(cont == 6){ tran = new Transicao(); Lista.add(tran); }

A linha até pode existir, mas ai faça algo como:

Transicao temp = new Transicao();
temp.setCampo(tran.getCampo());
list.add(temp);

Abraços.

nel

wellington.nogueira:
nel:

A linha até pode existir, mas ai faça algo como:

Transicao temp = new Transicao();
temp.setCampo(tran.getCampo());
list.add(temp);

Abraços.


O que eu quis dizer é que a atribuição feita não poderia. Desse jeito que vc fez, aí sim, sem problemas.

A sim, perfeito wellington.
Abraços!

WellingtonRamos

Tente isso:

if(cont == 6){ temp = new Transicao(); // temp = tran; --> Essa linha NÃO pode existir Lista.add(temp); }

ou isso

if(cont == 6){ tran = new Transicao(); Lista.add(tran); }

WellingtonRamos

nel:

A linha até pode existir, mas ai faça algo como:

Transicao temp = new Transicao();
temp.setCampo(tran.getCampo());
list.add(temp);

Abraços.


O que eu quis dizer é que a atribuição feita não poderia. Desse jeito que vc fez, aí sim, sem problemas.

Criado 12 de maio de 2011
Ultima resposta 13 de mai. de 2011
Respostas 17
Participantes 5