Отказоустойчивый итератор для стека - PullRequest
0 голосов
/ 03 июня 2018

Я хочу реализовать Fail-Fast Iterator, чтобы удалить Entrys из моего собственного Списка и проверить его на правильное поведение.Список содержит элементы типа 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;
    }
}

Сам список отслеживает свою позицию с помощью позиции Pos и ​​ведет себя как стек.Теперь я хотел бы реализовать отказоустойчивый итератор, который позволяет выполнять итерацию по списку и удалять Entrys вместо генерирования исключения UnsupportedOperation.

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

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

    private MyEntry<E> begin;

    private MyEntry<E> pos;


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


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


    public boolean endpos() { 
        return pos.next == null;
    }


    public void reset() {
        pos = begin;
    }

    /**
     * Advances one step in this List.
     *
     * @throws NoSuchElementException if the last Entry of this List already has been reached.
     */
    public void advance() {
        if (endpos()) {
            throw new NoSuchElementException("Already at the end of this List");
        }
        pos = pos.next;
    }

    /**
     * Returns the actual element of this List.
     *
     * @return the actual element
     * @throws RuntimeException if the last Entry of this List already has been reached.
     */
    public E elem() {
        if (endpos()) {
            throw new NoSuchElementException("Already at the end of this List");
        }
        return pos.next.o;
    }

    /**
     * Inserts <code>o</code> in this List. It will be placed before the actual
     * element. After insertion the inserted element will become the actual
     * element.
     *
     * @param x the element to be inserted
     */
    public void add(E x) {
        MyEntry<E> newone = new MyEntry<E>(x, pos.next);

        pos.next = newone;
    }

    /**
     * Deletes the actual element of this List. The element after the actual
     * element will become the new actual element.
     *
     * @throws NoSuchElementException if the last Entry of this List already has been reached.
     */
    public void delete() {
        if (endpos()) {
            throw new NoSuchElementException("Already at the end of this List");
        }
        pos.next = pos.next.next;
    }

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            private MyEntry<E> it = null;

            @Override
            public boolean hasNext() {
                return pos != null;
            }
            @Override
            public E next() {
                if (it==null)
                    it = begin;
                else
                    it = it.next;
                return it.o;
            }
            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

}

Я также уже пытался внедрить итератор в свой список ипроверил это с моим тестом Class

public class MyListTest {

@Test
public void test() {

    MyList list = new MyList();

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

    while(list.iterator().hasNext()==true) {
        System.out.println(list);
    }

    list.iterator().remove();

    while(list.iterator().hasNext()==true) {
        System.out.println(list);
    }
}

}

Но выход зацикливается на c и даже не удаляет запись.

Теперь я застрял на правильномреализация Fast-Fail Iterator, который может перебирать MyList и удалять Entrys.Поскольку я не мог разбить ее на одну проблему, я составил список из нескольких вопросов, которые возникли, пока я пытался реализовать Iterator

  • Должен ли Iterator быть реализован в классе MyList или он должен бытьреализован в своем собственном классе?
  • Как заставить итератор продвигаться вперед по MyList, как это сделал метод advance ()?
  • Удобен ли цикл while в тестовом классе или должен использоваться другой метод?будет использоваться вместо?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...