Как работает linklist.iterator (). Next ()? - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь понять, как работает итератор в случае первого элемента. Например, когда мы вызываем iterator.next () в первый раз, почему он возвращает индекс 0, а не 1? есть похожая тема, которая несколько отвечает на вопрос, но сам код, похоже, не соответствует. Как работает метод next () на итераторах?

этим кодом кажется, что фактически следующий метод возвращает текущий элемент и перемещает курсор к следующему.

@SuppressWarnings("unchecked")
public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();

    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();

    cursor = i + 1;
    return (E) elementData[lastRet = i];
}

Каким образом тогда правильно думать об этом методе? Должен ли я просто игнорировать документ Java, и думать о нем как о возвращении тока и перейти к следующему?

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Как в случае, когда мы вызываем iterator.next () в первый раз, почему это вернуть индекс 0, а не 1?

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

Каким образом тогда правильно думать об этом методе? нужно ли мне просто игнорируйте документ Java и думайте об этом как о текущем к следующему?

Нет. Ваша ментальная модель несовместима с документами, вы должны сначала подумать, нуждается ли ваша модель в корректировке. И в этом случае вы можете прийти к этой лучшей модели:

  • Для любого итератора существует, возможно, пустая последовательность элементов, по которой он будет повторяться. Метод next() возвращает следующий, который еще должен вернуть итератор.

  • Так как это применимо к Lists, то бесполезно думать, что итератор вообще имеет элемент current . У него есть следующий элемент (возможно) и предыдущий элемент (возможно), но нет текущего. Вы можете думать об этом как о между элементами или до первого или после последнего.

0 голосов
/ 13 января 2019

Потому что, когда вы еще не видели ни одного элемента, первый элемент - «следующий». Начальная позиция итератора находится перед первым элементом.

Рассмотрим прилавок в магазине. За прилавком стоит сотрудник магазина, но он пока не обслуживает ни одного покупателя. Клиенты появляются и формируют линию.

Нет «текущего» клиента. Никто не обслуживается.

Сотрудник теперь готов обслуживать клиентов и звонит «пожалуйста, следующий клиент». Человек во главе линии выходит вперед. Теперь он / она является «текущим» клиентом.

0 голосов
/ 13 января 2019

cursor инициализируется в 0, и поскольку next() возвращает элемент с индексом cursor (значение до увеличения cursor, которое хранится в i), первый вызов next() возвращает первый элемент (с индексом 0).

Инвариант этого итератора состоит в том, что cursor всегда содержит индекс следующего элемента. Следовательно, каждый вызов next() возвращает элемент с индексом cursor и увеличивает cursor.

...