Итератор выходит за границы - PullRequest
0 голосов
/ 04 июня 2018

Мне нужно реализовать свой собственный итератор для моего класса List, который функционирует как стек и реализует java.lang.Iterable.Метод Iterator, реализованный в классе List, должен возвращать Iterator.

 @Override
public Iterator<E> iterator() {

    return new Iterator<>() {

        private MyEntry<E> it = begin;

        @Override
        public boolean hasNext() {

            if(pos.next != null) {
                return true;
            }
            else {
                return false;
            }
            }

        @Override
        public E next() {
            if (!hasNext()) {
                reset();
            }
            else {
                it = it.next;
            }
            return it.o;
        }

        @Override
        public void remove() {

        }
    };
}

Сам список работает как стек.Он имеет начальную запись, которая отмечает начало списка.Каждая запись содержит ссылку на следующую запись.С помощью элемента pos список отслеживает свою позицию.Метод advance () позволяет вам пройти через список Entry by Entry.Метод elem () возвращает значение, которое Entry хранит в позиции pos.Метод add () добавляет запись в конец списка.Метод delete () удаляет запись в позиции.

import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyList<E> implements Cloneable, java.lang.Iterable {


public MyList() {
    pos = begin = new MyEntry<E>();
}

public boolean empty() {
    return begin.next == null;
}

public boolean endpos() { // true, if end has been reached
    return pos.next == null;
}

public void reset() {
    pos = begin;
}

public void advance() {
    if (endpos()) {
        throw new NoSuchElementException("Already at the end of this List");
    }
    pos = pos.next;
}

public E elem() {
    if (endpos()) {
        throw new NoSuchElementException("Already at the end of this List");
    }
    return pos.next.o;
}


public void add(E x) {
    MyEntry<E> newone = new MyEntry<E>(x, pos.next);

    pos.next = newone;
}


public void delete() {
    if (endpos()) {
        throw new NoSuchElementException("Already at the end of this List");
    }
    pos.next = pos.next.next;
}

Записи, которые содержит список, имеют общее значение o и ссылку на следующую MyEntry

    class MyEntry<E>  {

    MyEntry<E> next;
    E o;

    MyEntry() {
        this(null, null);
    }

    MyEntry(E o) {
        this(o, null);
    }

    MyEntry(E o, MyEntry<E> e) {
        this.o = o;
        this.next = e;
    }
}

, но вВ тот момент, когда я тестирую его с помощью моего тестового класса MyListTest, я получаю три тестовые строки, но после этого программа выдает NullPointerException в методе next () при возврате it.o

import org.junit.Test;
import java.util.*;

public class MyListTest {

 @Test
 public void test() {
     MyList list = new MyList();
     Iterator itr = list.iterator();

    list.add("a");
    list.add("b");
    list.add("c");

    while(itr.hasNext()) {
        Object element = itr.next();
        System.out.println(element + " ");
    }

    iter.remove();

    while(itr.hasNext()) {
        Object element = itr.next();
        System.out.println(element + " ");
    }
}

}


Мой вопрос заключается в том, почему после последней записи у Итератора заканчиваются границы и как я могу это предотвратить.

1 Ответ

0 голосов
/ 05 июня 2018

Таким образом, решение состояло в том, что метод hasNext ()

        @Override
        public boolean hasNext() {

            if(pos.next != null) {
                return true;
            }
            else {
                return false;
            }
        }

должен был быть

        @Override
        public boolean hasNext() {

            if(it.next != null) {
                return true;
            }
            else {
                return false;
            }
        }

Поскольку ни hasNext (), ни next () не должны мешать элементу pos.Итератор должен сохранять свою собственную позицию независимой от остальной части класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...