Lié la mise en œuvre Liste en Java avec les génériques et amélioré pour
-
05-10-2019 - |
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 ()
{
}
}
La solution
- Vous devriez avoir
Iterable<T>
au lieu deIterable<Object>
. -
add(Node)
n'ajoute pas un objet à la liste. -
MyLinkedListIterator<T>
devrait mettre en œuvreIterator<T>
. -
MyLinkedListIterator.hasNext()
va lancer uneNullPointerException
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.
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;
}