проблема с использованием ListIterator для LinkedList в Java - PullRequest
1 голос
/ 02 июля 2010

Можно ли перебирать LL в Java с помощью ListIterator, периодически добавлять объекты в список и обрабатывать эти элементы в списке в порядке их добавления?

Допустим, я начинаю с LL с единственным объектом в нем. Я обрабатываю этот объект и решаю, что хочу добавить два дополнительных объекта, которые я хочу дополнительно обработать (например, FIFO). Интуитивно я начинаю процесс с

while (itr.hasNext()) {
itr.next();
...
itr.add();
}

Однако, похоже, это быстро рушится - add фактически добавляет элементы ДО индекса, в котором я сейчас нахожусь, а не после ( ListIterator javadoc ). Это означает, что когда я снова запускаю цикл while, он фактически не распознает, что материал был добавлен в LL, потому что ему действительно нужно идти НАЗАД (.hasPrevious() вместо .hasNext()), чтобы найти его. Но я не могу начать LL с .hasPrevious() (я не думаю), потому что первый элемент в LL - это элемент .next().

Как правильно это сделать? Или я просто тупой?

Ответы [ 3 ]

1 голос
/ 02 июля 2010

Вы не указали полное определение в своем комментарии выше:

Вставка указанного элемента в список (необязательная операция).Элемент вставляется непосредственно перед следующим элементом, который будет возвращен следующим, если он есть, и после следующего элемента, который будет возвращен предыдущим, если он есть.(Если список не содержит элементов, новый элемент становится единственным элементом в списке.) Новый элемент вставляется перед неявным курсором: последующий вызов next не будет затронут, а последующий вызов previous будет возвращенновый элемент.(Этот вызов увеличивает на единицу значение, которое будет возвращено при вызове nextIndex или previousIndex.)

Новый элемент вставлен, поэтому для его получения необходимо вызвать previous ().

Если вам нужно вставить элемент в текущую точку итерации, вам придется выполнить управление самостоятельно и вызвать функцию previous (), что потребует некоторой перестройки цикла.

ЕслиВы можете добавить новые элементы в конец списка и обработать их позже, вместо этого используйте реализацию очереди.

0 голосов
/ 02 июля 2010

Если вы не собираетесь выполнять удаление в цикле, вы можете вызвать previous() один раз за вызов add() в конце тела цикла. Это оставит курсор перед первым добавленным элементом, который затем будет возвращен next() на следующей итерации. Я должен сказать, я чувствую, что должен быть лучший способ сделать эту обработку все же.

0 голосов
/ 02 июля 2010

Я полагаю, что вы должны разделить добавление в список и повторять его.

...