Я хочу реализовать 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 в тестовом классе или должен использоваться другой метод?будет использоваться вместо?