我已经写了自己的LinkedList
,因为我不想手动进行迭代,所以总是检查null
。我以为我应该编写自己的Iterator
方法来返回迭代器。
我的问题是,我真的不知道如何将List和Iterator链接在一起。我认为这是我的TypeMismatch
问题的更深层原因。
public class SearchList<T extends Comparable<T>> implements List<T> {
public class Node {
T obj;
Node next;
int occurences;
public Node() {
this.obj = null;
this.next = null;
this.occurences = 1;
}
}
private Node head;
//Here are my List methods
}
这是迭代器方法
@Override
public Iterator<T> iterator() {
Node current = head;
Iterator<T> iterator = new Iterator<T>() {
@Override
public boolean hasNext() {
return current.next != null;
}
@Override
public T next() {
return current.next;
}
};
return iterator;
}
Intellij抱怨迭代器的重写next()方法中的类型不匹配。
那么我该如何正确实施呢?
答案 0 :(得分:0)
current.next
是另一个Node
实例(下一个节点),而不是数据(T
类型的数据)
将其更改为
@Override
public T next() {
T data = current.obj;
current = current.next;
return data;
}
此外,您的hasNext
条件检查current.next != null
,因此您将无法访问最后一个元素。可能必须将其更改为current != null
此答案假设您需要Iterable<T>
而不是Iterable<Node>
。
更新:
如果要遍历Node
,则必须返回Iterator<Node>
@Override
public Iterator<Node> iterator() {
Node current = head;
Iterator<Node> iterator = new Iterator<>() {
@Override
public boolean hasNext() {
return current!= null;
}
@Override
public T next() {
Node currentNode = current;
current = current.next;
return currentNode;
}
};
return iterator;
}