Реализация итератора в связанном списке

Я создаю реализацию 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

Другие вопросы по тегам