Реализация итератора в связанном списке
Я создаю реализацию LinkedList, используя только несколько методов в стандартной реализации. Я столкнулся с проблемой при добавлении функции Iterator в мой LinkedList.
Прямо сейчас я могу добавить некоторые элементы, а затем что-то вроде этого
class testList {
public static void main(String[] args){
MyLinkedList<String> list = new MyLinkedList<String>();
list.add("Element 0");
list.add("Element 1");
list.add("Element 2");
Iterator<String> iter = list.iterator();
System.out.println(iter.next());
System.out.println(iter.next());
System.out.println(iter.next());
for (String s : list){
System.out.println(s);
}
}
}
И все работает, кроме последней части, при попытке скомпилировать я получаю сообщение об ошибке: for-each не применимо к типу выражения для (String s: list)
Есть ли что-то очевидное, что я упустил из виду при реализации?
Вот остальная часть моего кода, я использую пользовательские интерфейсы для Iterable и List
interface List<T> extends Iterable<T> {
public int size();
public void add(int pos, T x);
public void add(T x);
}
interface Iterator<T> {
boolean hasNext();
T next();
}
interface Iterable<T> {
Iterator<T> iterator();
}
А вот и основная часть кода
import java.util.* ;
class MyLinkedList<T> implements List<T> {
private Node<T> head;
private Node<T> tail;
private int currentSize;
//constructor for class
public MyLinkedList(){
this.head = null;
this.tail = null;
this.currentSize = 0;
}
//Node class used to hold the information, and link to each other
public class Node<E> {
private E data;
private Node<E> next;
//constructor for node class
public Node(E data, Node<E> next){
this.data = data;
this.next = next;
}
public E getData(){
return this.data;
}
public void setData(E newData){
this.data = newData;
}
public Node<E> getNext(){
return this.next;
}
public void setNext(Node<E> newNext){
this.next = newNext;
}
}
class LinkedListIterator implements Iterator<T>{
private Node<T> current;
public LinkedListIterator(){
current = head;
}
public T next(){
if (current == null){
throw new NoSuchElementException();
}
T temp = current.getData();
current = current.getNext();
return temp;
}
public boolean hasNext(){
return current != null;
}
}
public Iterator<T> iterator(){
return new LinkedListIterator();
}
public int size(){
return this.currentSize;
}
public boolean isEmpty(){
return this.size() == 0;
}
public void add(int pos, T x){
if(pos < 0 || pos > size()){
throw new IndexOutOfBoundsException();
}
if(pos == size()){
add(x);
return;
}
if (pos == 0){
head = new Node(x, head);
}else{
Node<T> current = head;
for(int j = 0; j < pos-1; j++){
current = current.getNext();
}
current.setNext(new Node(x, current.getNext()));
}
currentSize++;
}
public void add(T x){
if(isEmpty()){
head = new Node(x, null);
tail = head;
}else{
tail.setNext(new Node(x, null));
tail = tail.getNext();
}
currentSize++;
}
}
1 ответ
Это потому, что вы предоставили свою собственную реализацию Iterable
, Для for-each
чтобы работать, вы должны реализовать java.util.Iterable