Путаница в отношении начальной позиции указателя в списке, повторяемом интерфейсом Iterator

1

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

делает следующий метод

(1) возвращает следующий элемент и указывает на следующий элемент или (2) возвращает исходный элемент и устанавливает указатель на следующий элемент.

но если (1) истинно, то указатель находится на первом элементе, тогда первый элемент не может быть возвращен, т.е. если (1) истинно, то указатель должен быть до первого элемента, т.е. в каком-то -1 положении.

с другой стороны, если (2) истинно, то мы можем удалить первый элемент, но мы не можем получить следующий элемент, используя следующий, потому что мы уменьшим индекс на 1;

который приводит меня к следующему вопросу. Метод remove() уменьшает индекс на один или сохраняет его одинаковым?

Контекстный код приведен ниже:

package iterators;
import java.util.ArrayList;
import java.util.Iterator;
public class Array_practice {
    public static void main(String args[])
    {
        ArrayList<Integer> list= new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        Iterator<Integer> iterator= list.iterator();
        iterator.remove();//does not work why??

    }

} 
  • 0
    Не могли бы вы добавить несколько разрывов строк? Трудно понять, когда это написано в таком стиле.
Теги:

2 ответа

4
Лучший ответ

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

Нет. Это до первого пункта списка. Вы получаете только первый элемент, когда вы вызываете next() в первый раз.

На самом деле обычно проще рассматривать итератор как между элементами. Так, например, с вашим списком:

  1   2   3
^              // Initial position
    ^          // After calling next()
        ^      // After calling next()
            ^  // After calling next() the third time - now hasNext() will return
               // false

Затем remove() - как задокументировано - удаляет последний элемент, который был возвращен.

Вы вызываете remove() прежде чем какие-либо элементы будут возвращены... так что ничего не удалить.

1

Интерфейс Javadoc для Iterator выглядит следующим образом:

void remove()

Удаляет из базовой коллекции последний элемент, возвращаемый этим итератором (необязательная операция). Этот метод можно вызвать только один раз для каждого вызова next(). Поведение итератора не определено, если базовая коллекция модифицирована, пока итерация выполняется каким-либо образом, кроме как путем вызова этого метода.

Таким образом, использование remove() перед вызовом next() никогда не вернет элемент. Это, конечно, если класс, который вы повторяете, соблюдает контракт на реализацию Iterable - это, очевидно, случай ArrayList и других коллекций java.util.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню