Encadeamento Duplo

10 respostas
C

Amigos,

Tenho uma classe que implementa o conceito de lista duplamente encadeada e vou armazenar objetos e seus atributos dentro dela.
Que acessar os atributos destes objetos dentro da lista via get e set, mas estou tendo dificuldades.

O que posso fazer nessa caso?

Obrigado!

10 Respostas

matheuslmota

E o que você já fez?

C

Tentei acessar os elementos via get e set, exemplo:

lista.getFirst().getNome();
lista.getElement().getNome();

matheuslmota

Poderia postar o código da classe que implementa a lista? Só com o que você informou não irei conseguir ajudá-lo.

C
class DNode<Animal> {

    private Animal element;
    private DNode<Animal> next;
    private DNode<Animal> previous;

    public DNode(Animal element) {
        this.element = element;
        this.next = this.previous = null;
    }

    public Animal getElement() {
        return element;
    }

    public void setElement(Animal element) {
        this.element = element;
    }

    public DNode<Animal> getNext() {
        return next;
    }

    public void setNext(DNode<Animal> next) {
        this.next = next;
    }

    public DNode<Animal> getPrevious() {
        return previous;
    }

    public void setPrevious(DNode<Animal> previous) {
        this.previous = previous;
    }
}

public class AnimalList<Animal> {

    private DNode<Animal> head;
    private DNode<Animal> tail;
    private int size;
    private int pos;

    public AnimalList() {
        head = tail = null;
        size = 0;
    }

    public void insereFrente(Animal animal) {
        DNode<Animal> n = new DNode<>(animal);
        if (head == null) {
            head = tail = n;
        } else {
            head.setPrevious(n);
            n.setNext(head);
            head = n;
        }
        size++;
    }

    public Animal getFirst() {
        return head.getElement();
    }

    public void mostraLista() {
        DNode<Animal> current = head;
        while (current != null) {
            System.out.println(current.getElement());
            current = current.getNext();
        }
    }

    public int getSize() {
        return size;
    }
}
matheuslmota

As classe DNode e AnimalList estão corretas. Você deve está setando cópias dos objetos e não os objetos em si. Mostre como os objetos da lista estão sendo setados.

C
public class Teste {

    public static void main(String[] args) {

        AnimalList LISTA = new AnimalList();

        Animal A = new Animal("Cachorro");

        LISTA.insereFrente(A);

        Animal B = new Animal("Vaca");

        LISTA.insereFrente(B);

         
        // AQUI DA ERRO: LISTA.getFirst().setNome("Passaro");
        

        LISTA.mostraLista();

    }
}
matheuslmota

Cara, tem um erro no seu método mostraLista.

public void mostraLista() { DNode<Animal> current = head; while (current != null) { System.out.println(current.getElement()); // Aqui ele tenta chamar o método toString da classe Animal current = current.getNext(); } }

Você pode sobrescrever o método toString de Animal para retornar o nome:

@Override public String toString() { return name; }

Acho que isso resolve seu problema.

C

Ok.

Quanto a impressão dos valores na lista está funcionando.
O problema é setar um valor a um atributo de um objeto dentro da lista.

LISTA.getFirst().setNome("Passaro");

O código acima não compila ou não parece fazer sentido para o compilador.

matheuslmota
Eu fiz esse teste aqui e funcionou:
public static void main(String[] args) {
		AnimalList<Dog> animalList = new AnimalList<Dog>();
		Dog dog1 = new Dog();
		dog1.setName("Dog1");

		Dog dog2 = new Dog();
		dog2.setName("Dog2");

		Dog dog3 = new Dog();
		dog3.setName("Dog3");

		animalList.insereFrente(dog3);
		animalList.insereFrente(dog2);
		animalList.insereFrente(dog1);

		animalList.getFirst().setName("Teste");
		System.out.println(animalList.getFirst().getName()); // imprime Teste
	}
public class Dog {
	private String _name;

	public String getName() {
		return _name;
	}

	public void setName(String name) {
		_name = name;
	}
}
C

Funcionou!

Obrigado pela ajuda!

Criado 17 de novembro de 2012
Ultima resposta 18 de nov. de 2012
Respostas 10
Participantes 2