Реализовать обход foreach для своей коллекции

426
25 декабря 2016, 19:54

В учебных целях нужно было самостоятельно реализовать связные списки и сделать так, чтобы был возможен обход через foreach. Как я понял, нужно в коллекции реализовать Iterable и создать класс реализующий Iterator. Вопрос в том, что именно делать в методе интерфейса Iterable

 public void forEach(Consumer action)

и методе интерфейса Iterator

 public void forEachRemaining(Consumer<? super E> action) throws NullPointerException
Answer 1

Раз специалисты по Java не отвечают, и @Barmaley пока не вернулся, попробую написать я.

public class MyLinkedList<T> implements Iterable<T> {
    // имплементация вашего класса
    public Iterator<T> iterator() {
        return new MyLinkedListIterator();
    }
    private class MyLinkedListIterator implements Iterator<T> {
        private MyListNode curr;
        public MyLinkedListIterator() {
            this.curr = MyLinkedList.this.head; // голова списка
        }
        public boolean hasNext() {
            return this.curr != null;
        }
        public T next() {
            if (!this.hasNext()) {
                throw new NoSuchElementException();
            }
            T value = curr.value; // значение в текущем узле
            curr = curr.next;     // следующий узел
            return value;
        }
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
}

Больше ничего делать не надо, это компилируется. Теперь можно писать:

MyLinkedList<Integer> l = new MyLinkedList<>();
for (Integer v : l) {
    System.out.println(v);
}
READ ALSO
Как добавить в архив папку, используя Zip4j и OutputStream

Как добавить в архив папку, используя Zip4j и OutputStream

Я пытаюсь добавить в архив папку вот так (в соответствии с документацией):

385
Печать через USB из термо-принтера Java

Печать через USB из термо-принтера Java

Хочу печатать чеки из термо-принтера VKP80II с Java через USBДолго насиловал гугл, на русском ничего не нашел

394
Не выполняется sql запрос

Не выполняется sql запрос

Почему то после строки где мы делаем выполнение, ничего с базы не вытаскивается, а сразу переходит в блок finallyВсе данные есть и имена прописаны...

348
Как свертать Java за вечер? [требует правки]

Как свертать Java за вечер? [требует правки]

?! Как свертать Java за вечер?

420