Question

Je vous demandons d'examiner ma mise en œuvre d'une liste chaînée (SLL) s'il vous plaît. La mise en œuvre devrait utiliser les médicaments génériques et être en mesure d'utiliser le amélioré pour.

Le problème est que, quand je fais for (Number n : list) être list un MyLinkedList<Integer> ou MyLinkedList<Double>, je reçois l'erreur: « Incompatibilité de type: ne peut pas convertir type d'élément objet Number ».

est ce que j'ai. Les parties que je ne suis pas très certain sont sur les génériques et les itérateurs.

Merci à l'avance.

import java.util.Iterator;

public class MyLinkedList<T> implements Iterable<Object>
{
    private Node head;

    public MyLinkedList ()
    {
        head = null;
    }

    public void add (Node n)
    {
        if (head == null)
        {
            head = n;
        }

        else
        {
            Node node = head;
            while (node.next != null) 
            {
                node = node.next;
            }
            node = n;
        }
    }

    public Iterator iterator() 
    {
        return new MyLinkedListIterator (head);
    }

    public int size () 
    {
        int ret = 0;
        MyLinkedListIterator it = new MyLinkedListIterator (head);
        while (it.hasNext ())
        {
            it.next();
            ret++;
        }

        return ret;
    }

    public Node getHead ()
    {
        return head;
    }
}

class MyLinkedListIterator<T> implements Iterator
{
    private Node node;

    public MyLinkedListIterator (Node h)
    {
        node = h;
    }

    public MyLinkedListIterator (MyLinkedList<T> l)
    {
        this(l.getHead ());
    }

    public boolean hasNext () 
    {
        if (node.next == null)
        {
            return false;
        }

        else
        {
            return true;
        }
    }

    public Object next () 
    {
        return node.next;
    }

    public void remove () 
    {

    }   
}
Était-ce utile?

La solution

  • Vous devriez avoir Iterable<T> au lieu de Iterable<Object>.
  • add(Node) n'ajoute pas un objet à la liste.
  • MyLinkedListIterator<T> devrait mettre en œuvre Iterator<T>.
  • MyLinkedListIterator.hasNext() va lancer une NullPointerException si la liste est vide.
  • MyLinkedListIterator.next() ne se déplace pas à l'élément suivant dans la liste.

Autres conseils

Vous devriez retourner un Iterator<T> de la méthode de iterator et vous devez également étendre Iterable<T> au lieu de Iterable<Object>.

En outre, votre MyLinkedListIterator<T> devrait mettre en œuvre Iterator<T>. Ensuite, il devrait fonctionner.

Pourquoi ne pas utiliser <E>

public class Node<E>{
 E data;
 Node<E> next;
}

public class SinglyLinkedList<E> {

 Node<E> start;
 int size;
 .......
}

Regardez pour une mise en œuvre complète

En plus de ce que les autres ont dit, vous ne devriez probablement pas exposerons Node dans vos méthodes publiques -. Nœuds devrait être un aspect purement interne de la mise en œuvre

Élargir le point:. MyLinkedListIterator.next () ne se déplace pas à l'élément suivant dans la liste

la méthode suivante doit être quelque chose le long de ces lignes pour le faire fonctionner:

public T next() {
    if(isFirstNode) {
        isFirstNode = false;
        return node.data;
    }
    node = node.next;
    return node.data;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top