ArrayList ou Encadeamento duplo de Nodos

32 respostas
guisantogui

Gente, to com uma dúvida séria aqui, não sei se devo implementar usando o Sistema de Nodos ou ArrayList.

Essa funcionalidade do sistema deve fazer que quando o usuario clicar no botão “Avançar” para uma proxima pessoa no seu cadastro apareça todos os dados da proxima pessoa da lista na interface, só que não sei se devo fazer isso usando um ArrayList ou Sistema de Nodos, há e o seguinte, o sistema também deverá poder “Voltar” um cadastro e Avançar para o último e primeiro da lista diretamente, mas esses ultimos não são problema e sim o avançar e voltar.

Se junto com a melhor opção para fazer, pudessem postar algo sobre como fazer essa navegação e inserção da novas pessoas, pq deu um branco aki! :?
PS.: não so mto bom com os nodos então se é pouca coisa a diferença eu prefereria fazer com ArrayList

Obrigado Pessoal

32 Respostas

Trebloc

Na classe da sua lista você guarda referências ao primeiro e último nodo:

class Node
{
    private Node previous;
    private Object data;
    private Node next;

    Node(Node previous, Object data, Node next)
    {
        ...
    }

    ...
}

public class ListaEncadeada
{
    private Node head; // nó-cabeça
    private Node tail; // nó-cauda

    public ListaEncadeada()
    {
        cabeca = null;
        cauda = null;
    }
    ...
}

Daí, caso você queira inserir um novo elemento, por exemplo, você pode começar do início ou do fim (lembrando de instanciar a cabeça e a cauda, caso a lista esteja vazia).

guisantogui

Obrigado!

Se alguem mais souber mais alguma coisa ou link q possa me ajudar!
agradeço!
:wink:

Giovanni_Ritchie

http://www.programei.org/index.php/04/09/2009/lista-duplamente-encadeada-em-java/

guisantogui

Obrigado, acabei de abrir o link, mas continuo aceitando sugestões! :slight_smile:

guisantogui

Alguém saberia me dizer como ficaria um metodo de adição de elementos na lista duplamente encadeada?

Eu me enrolei com os nodos, será que devo usar algum método auxiliar, se puderem postar alguns exemplos eu agradeço!

Brigadão gurizada! :wink:

Giovanni_Ritchie

http://docs.google.com/viewer?a=v&q=cache:4Bk3EqBUslcJ:ltodi.est.ips.pt/atai/index_files/TADs%2520em%2520Java%2520e%2520Estruturas.pdf+lista+duplamente+encadeada+java&hl=pt-BR&gl=br&sig=AHIEtbT_EyOwV7Bu1LlRdCvQU0Wh_WegiA

ou

http://docs.google.com/viewer?a=v&q=cache:4Bk3EqBUslcJ:ltodi.est.ips.pt/atai/index_files/TADs%2520em%2520Java%2520e%2520Estruturas.pdf+lista+duplamente+encadeada+java&hl=pt-BR&gl=br&sig=AHIEtbT_EyOwV7Bu1LlRdCvQU0Wh_WegiA

guisantogui

Gente, to com uma dúvida séria aqui, não sei se devo implementar usando o Sistema de Nodos ou ArrayList.

Essa funcionalidade do sistema deve fazer que quando o usuario clicar no botão “Avançar” para uma proxima pessoa no seu cadastro apareça todos os dados da proxima pessoa da lista na interface, só que não sei se devo fazer isso usando um ArrayList ou Sistema de Nodos, há e o seguinte, o sistema também deverá poder “Voltar” um cadastro e Avançar para o último e primeiro da lista diretamente, mas esses ultimos não são problema e sim o avançar e voltar.

Se junto com a melhor opção para fazer, pudessem postar algo sobre como fazer essa navegação e inserção da novas pessoas, pq deu um branco aki!
PS.: não so mto bom com os nodos então se é pouca coisa a diferença eu prefereria fazer com ArrayList

Agradeço!

guisantogui

Alguem saberia como eu devo fazer esta aplicação?

Obrigado

guisantogui

Ainda trancado!
Se alguem puder me ajudar eu to ai! :roll:

B

“Sistema de Nodos” em Java, é implementado pelo LinkedList

Leia o Javadoc das implementações e a documentação do Collections para saber qual é melhor para cada situação. Se ainda estiver com dúvidas, pergunte aqui.

Edit: Dê uma olhada também no ListIterator, para navegar nas coleções do começo ao fim, e vice-versa.

gpd38

Olha o que o Bruno disse sobre Collection.

O seu avançar simplesmente será um next na sua lista encadeada, ou seja, vc guarda a posição em que esta e add++ para mostrar a proxima.

guisantogui

Muito boa a classe listIterador é exatamente o que eu estava buscando uma classe parecida com ArrayList, mas com metodos de proximo e anterior!

Muito obrigado!

guisantogui

Opa, axo q me enganei com a classe ListIterator eu axei q os metodos todos já estavam implementados mas é necessário implementar tudo, não me ajudou muito, sobre o material, é todo em ingles, isso dificulta um pouco as coisas! :?

B

Você está bem enganado que precisa implementar alguma coisa, tudo já está feito na API do Java.

ListIterator é uma interface, não uma classe. Ela é usada pelas classes que implementam a interface List, como o ArrayList e LinkedList, ao chamar o método listIterator().

Como disse, está tudo escrito nos Javadocs.

guisantogui

Poderia dar um exemplo da ultilização de um metodo de navegação?

É que estou bem perdido com esses Nodos e “heads” e “tails” e “next() e prev()”!!

Agradeço pela ajuda de todos! :wink:

M

Supondo que seja um ArrayList de Contato:

ArrayList<Contato> contatos = metodoQuePreencheOArrayList();
// pegamos o ListIterator
ListIterator<Contato> iterator = contatos.listIterator();
// vamos iterar do início ao fim
while(iterator.hasNext()) {
    Contato c = iterator.next();
    imprime(c.getNome());
}
// e agora ao contrário
while(iterator.hasPrevious()) {
    Contato c = iterator.previous();
    imprime(c.getNome());
}
guisantogui

Olha minha idéia, meio maluca mas pode funcionar!

Se eu usar um for com minhaLista.indexOf(pegava o cadastro da tela), e depois usava esse “int” que iria sair somar com mais um e fazer um “get()” com isso?

parece meio louco, olhe o código: :smiley:

int i = minhaLista.indexOf(pesquisaPessoa(jTextField.getText()));
jTextFieldNome.setText(lista.get(i + 1).getNome());
jTextFieldCpf.setText(lista.get(i + 1).getNome());
.
.
.

Será que isso funcionaria para mim percorrer a lista

guisantogui

Fiz um teste o ListIterador, mas ele ta retornando uma NPE.

public class CadastroDePessoas<E> implements ListTAD<E> {  // Colocar implementação da interface NODE

    private LinkedList lista;


    public boolean add(){
        return lista.add(new Pessoa("a","a","a","a","a","a","a","a"));    // <- Nessa linha
    }

    public ListIterator a(){
        return lista.listIterator();
    }

Classe main

CadastroDePessoas cdp = new CadastroDePessoas();

      //  Pessoa p1 = new Pessoa("a", "a", "a", "a", "a", "a", "a", "a");

        cdp.add(); // <- e Nessa linha também
        System.out.println(cdp.a());
B

Funciona até você levar uma IndexOutOfBoundsException por passar um índice maior que o tamanho da lista, ou menor que zero. Sem falar que a performance será horrivel se mudar a implentação para listas ligadas, já que elas tem que percorrer a lista inteira até este índice.

guisantogui

É você tem razão, e o outro que eu fiz com o listIterator, sabe me dizer pq ta retornando uma NullPointerException?

guisantogui

Alguem tem algum projeto implementado com uma DoubleLinkedList?

Se puderem zipar e me enviar por e-mail, pelo menos a classe da list para mim dar uma olhada, pq naum tenho nenhum exemplo para tentar me espelhar!!

[email removido] - é meu msn tb podem add

Brigado pessoal!

B

Você esqueceu de instanciar o LinkedList.

guisantogui

Ahh, claro já to tão cansado de bater nesta tecla que esqueci de instanciar a lista!

Mas mesmo assim “não funcionou” corretamente me foi retornado no console:

java.util.LinkedList$ListItr@42e816 isso!

Sabe o q é?

mario.fts

a sua classe Pessoa não tem o método toString() implementado, então ele mostra pra vc o endereço de memória do objeto pessoa quando vc manda imprimir.

vc teria que fazer algo assim
class Pessoa{

public String toString(){

return this.nome + " " + this.endereço + ....

}
M

Você está imprimindo o objeto ListIterator. Mas você não deveria fazer isso. Deveria usar esse ListIterator para percorrer a lista e imprimir os objetos Pessoa dessa lista (veja o exemplo lá em cima).

Trebloc

Todas as coleções em Java possuem um método toString que já retorna uma String devidamente formatada representando todos os objetos nelas contidos.

Ou seja, basta imprimir a sua lista que seu conteúdo será exibido (mas claro, como o mario.fts disse, a classe dos objetos que a lista possui devem ter um método toString sobrescrito).

guisantogui

ok jah resolvi este problema!

Mas ainda estou com dor de cabeça na navegação item a item na minha lista!

Por exemplo qro q na minha interface qdo eu clicar no botão proximo ele busca na lista o proximo elemento e coloca os dados nos campos da tela!
Se souberem de algum metodo ou tiverem alguma implementação de exemplo eu agradeço!

Vlw gurizada!

guisantogui

Se souberem agradeço msm a ajuda pq ta meio complicado aki!

guisantogui

Ainda com problemas alguem com alguma idéia?

M

marcobiscaro2112:
Supondo que seja um ArrayList de Contato:

ArrayList<Contato> contatos = metodoQuePreencheOArrayList(); // pegamos o ListIterator ListIterator<Contato> iterator = contatos.listIterator(); // vamos iterar do início ao fim while(iterator.hasNext()) { Contato c = iterator.next(); imprime(c.getNome()); } // e agora ao contrário while(iterator.hasPrevious()) { Contato c = iterator.previous(); imprime(c.getNome()); }


Isso ainda não ajudou? Qual é exatamente seu problema? Importante: leia a documentação: http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html

guisantogui

Um, isso poderá ajudar!

Mas é que preciso de um botão em uma interface que qdo eu clicar nele ele preencha os campos da tela com os dados do proximo elemento(Pessoa) da lista onde ela está!, e outro que faça o mesmo só que para traz!

Muito obrigado pela força gurizada! :wink:

guisantogui

Olha soh tentei adaptar seu codigo ao meu:

Classe CadatroDePessoas:

public class CadastroDePessoas{

    private LinkedList<Pessoa> lista;
    private ListIterator<Pessoa> iterador;

    public CadastroDePessoas(){
        lista = new LinkedList<Pessoa>();
        iterador = lista.listIterator();
    }

    public boolean add(Pessoa p){
        return lista.add(p);
    }

    public Pessoa proxima(){
        return lista.listIterator().next();
    }
    public void it(){
        while(iterador.hasNext()){
            Pessoa p = iterador.next();
            System.out.println(p.toString());
        }
    }

Main

public class Main {

    public static void main(String args[]){

        SimpleDateFormat spd = new SimpleDateFormat();
        GregorianCalendar gc = new GregorianCalendar(2010, 5, 20);
        spd.setCalendar(gc);

        CadastroDePessoas cdp = new CadastroDePessoas();

        Pessoa p1 = new Pessoa("oioioi", "a", "a", "a", "a", "a", "a", "a");
        Pessoa p2 = new Pessoa("a2", "2a", "2a", "22a", "2a", "2a", "2a", "2a");
        Pessoa p3 = new Pessoa("wow", "wow", "wow", "wow", "wow", "wow", "wow", "wow");
        Pessoa p4 = new Pessoa("2", "2", "2", "2", "2", "2", "2", "2");
        Pessoa p5 = new Pessoa("AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA");

        p1.setCpf("151515");
        p2.setCpf("4845152");
        p2.setCpf("[telefone removido]");
        p2.setCpf("165165815");
        p2.setCpf("564121851");

        p1.setDataNascimento(spd);
        p2.setDataNascimento(spd);
        p3.setDataNascimento(spd);
        p4.setDataNascimento(spd);
        p5.setDataNascimento(spd);
        cdp.add(p1);
        cdp.add(p2);
        cdp.add(p3);
        cdp.add(p4);
        cdp.add(p5);

        cdp.it();

E a excessão que esta estourando!

Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
        at java.util.LinkedList$ListItr.next(LinkedList.java:696)
        at Classes.CadastroDePessoas.it(CadastroDePessoas.java:30)
        at Classes.Main.main(Main.java:59)
Java Result: 1
Criado 2 de março de 2010
Ultima resposta 9 de mar. de 2010
Respostas 32
Participantes 7