Erro ao Imprimir um elemento LinkedList

3 respostas
WashingtonBotelho

Olá pessoal, este é meu primeiro post e preciso de uma ajuda básica, do mesmo jeito que espero poder ajudar iniciantes iguais a mim.

Estou tentando simular uma agenda usando LinkedList, e atrávez de um código eu pego o elemento da LinkedList, mas mesmo que eu tenho uma lista com 3 ou mais objetos do tipo Dados com Nome, Endereço etc, ao pedir para imprimir um elemento número X sempre é retornado pra mim os valores do último elemento adicionado à lista.

A agenda foi feito com Form e tudo mais, só que simplifiquei aqui só para efeitos de correção.

package novopacote;
import java.util.*;
import javax.swing.JOptionPane;

final class ClasseTeste {
  Dados dados = new Dados();
  List<Dados> lista = new LinkedList<Dados>();
  
  public void Cadastra(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {
    dados.setDados(nomeIn, ruaIn, bairroIn, cidadeIn, estadoIn, complementoIn, numeroIn, cepIn);
    lista.add(dados);
  }
  
  public Dados Busca(int codIn) {
    return lista.get(codIn - 1);
  }
  
  public static void main(String[] args) {
    ClasseTeste go = new ClasseTeste();

    go.Cadastra("1", "1", "1", "1", "1", "1", 1, 1);
    go.Cadastra("2", "2", "2", "2", "2", "2", 2, 2);
    go.Cadastra("3", "3", "3", "3", "3", "3", 3, 3);
    System.out.println("\nTamanho: " + go.lista.size());
    // Apesar de ter três elementos e em baixo eu tentar recuperar informações do elemento 1 (0 para a lista), só me é retornado os valores 3 do último elemento.
    
    System.out.println("1º Nome: " + go.Busca(1).getNome() + "\n2º Nome: " + go.Busca(2).getBairro());
  }
}
package novopacote;

final public class Dados {
  private String nome, rua, bairro, cidade, estado, complemento;
  private int numero, cep;

  public void setDados(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {
    nome = nomeIn;
    rua = ruaIn;
    bairro = bairroIn;
    cidade = cidadeIn;
    estado = estadoIn;
    complemento = complementoIn;
    numero = numeroIn;
    cep = cepIn;
  }

... // Aqui vem os métodos get.
}

Resposta:
Tamanho: 3
1º Nome: 3
2º Nome: 3

Deveria ser:
Tamanho: 3
1º Nome: 1
2º Nome: 2

Outra dúvida é que vi aqui no fórum algum coléga falando pra usar List lista = new LinkedList(); ao invéz de LinkedList mesmo. Por que?
Obrigado desde já. =]

3 Respostas

felipealbuquerque

Altere esse trecho de código:

public void Cadastra(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {  
    dados.setDados(nomeIn, ruaIn, bairroIn, cidadeIn, estadoIn, complementoIn, numeroIn, cepIn);  
    lista.add(dados);  
}

Para:

public void Cadastra(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {  
    dados = new Dados();
    dados.setDados(nomeIn, ruaIn, bairroIn, cidadeIn, estadoIn, complementoIn, numeroIn, cepIn);  
    lista.add(dados);  
}

Explicação:

Você não adiciona um objeto na lista… você adiciona a referência a ele. Sempre.
No caso, dados está referenciando sempre o mesmo objeto, portanto você está adicionando referências para o mesmo objeto em locais diferentes da lista. Por isso é que você está imprimindo sempre a mesma coisa.
Ao dar um new, você passa a referência para outro objeto. Aí sim dá certo.

felipealbuquerque

Perdão, só vi a sua outra dúvida agora. Utiliza-se a interface List porque fica mais fácil pra você mudar a implementação depois. Exemplo:

// Podemos alterar
List list = new LinkedList();

// Para
List list = new ArrayList();

// Sem mudar a estrutura do código, pois estamos utilizando a interface List

Dê uma pesquisada pelo fórum para encontrar maiores detalhes!

WashingtonBotelho

Nossa eu abri um sorriso aqui que só você vendo rs…
A explicação do List foi ótima também, mas nem sei usar este ArrayList ai. =]

Coléga, ajudou muito mesmo, agora ficou redondinho graças a você.
Obrigado e apesar de eu não saber muito, mas se eu puder ajudar estou a disposição.
Abraço… :smiley:

Criado 3 de dezembro de 2007
Ultima resposta 3 de dez. de 2007
Respostas 3
Participantes 2