Задать вопрос
@warchant
Пишу всё на всём

Как реализовать Iterator для собственного List?

Есть собственная реализация List на Java
class List<T> implements Iterable<T> {
    // code is here ...
    public Iterator<T> iterator() {
        // что нужно сюда писать?
    }

    class Node<T>{
    T value;  
    Node<T> next;
        // interface of Node is here.
    }
}


Нужно ли мне имплементить собственный класс?
Iterator<T> implements java.util.Iterator<T>{}

Или как-то можно по другому?

UPD:
Решил так:

@Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {
            private Node<T> current = first;

            @Override
            public boolean hasNext() {
                return current.hasNext();
            }

            @Override
            public T next() throws IndexOutOfBoundsException {
                T result = current.value;
                if (!current.hasNext()) throw new IndexOutOfBoundsException("End of list.");
                current = current.next;
                return result;
            }
        };
    }
  • Вопрос задан
  • 20633 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@kazmiruk
Да, вам нужно реализовать класс от Iterator и возвращать экземпляр этого класса в iterator методе. Если не хочется заморачиваться, то можете в Вашем List сразу имплементировать Iterator, соответственно в iterator() возвращать this ну и сразу добавить в нем методы next, hasNext. Таким образом у Вас вся логика будет сокрыта в одном классе, но объект будет одновременно и итерируемым, и итератором, что не очень хорошо в моем представлении.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
abs0lut
@abs0lut
Вот Вам реализация по первой ссылке в гугле:
import java.util.Iterator;

public class SOList<Type> implements Iterable<Type> {

    private Type[] arrayList;
    private int currentSize;

    public SOList(Type[] newArray) {
        this.arrayList = newArray;
        this.currentSize = arrayList.length;
    }

    @Override
    public Iterator<Type> iterator() {
        Iterator<Type> it = new Iterator<Type>() {

            private int currentIndex = 0;

            @Override
            public boolean hasNext() {
                return currentIndex < currentSize && arrayList[currentIndex] != null;
            }

            @Override
            public Type next() {
                return arrayList[currentIndex++];
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
        return it;
    }
}


Вот еще примеры
А вот тут и с объяснением
Ну и последний
Все, вот этот точно последний...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы