2010-07-02 3 views
1

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

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

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

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

Как это можно сделать чистым? Или я просто глуп?

+1

Вы пытаетесь реализовать очередь? –

+0

@bears: я так не думаю, потому что из того, что я понял в javadoc, очередь позволяет мне удалять вещи с фронта, но мне действительно нужно сохранить элементы в списке для последующей обработки.я мог бы использовать две структуры данных для решения этой проблемы, но мне интересно, почему я не могу использовать это ... – sepiroth

+0

Итак, похоже, что у вас есть два раунда обработки для определенного элемента; элементы обрабатываются в порядке FIFO - это правильно? Если это так, используйте две очереди. –

ответ

1

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

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

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

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

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

+0

Я думаю, это то, что я ищу ... это просто кажется, что это бесполезный класс, если я не могу добавить вещи в свой список и искать их тоже. – sepiroth

+0

На самом деле, я не думаю, что это то, что я ищу. Я упомянул об этом (не в цитате, а в тексте). как видно, этот класс кажется мне бесполезным. Мне интересно, не интерпретирую ли я его потенциал. если это действительно невозможно сделать то, что я хочу, то хорошо, но мне интересно, я просто не думаю об итерационном процессе творчески. – sepiroth

+1

Queue реализует Iterable, поэтому вам не нужно удалять вещи из очереди, вы все равно можете перебирать ее. Посмотрите на класс ConcurrentLinkedQueue. –

-1

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

+0

@duffymo: из связанного javadoc - «Итератор для списков, который позволяет программисту перемещаться по списку в любом направлении, изменять список во время итерации и получать текущую позицию итератора в списке». – sepiroth

+0

В соответствии с [Sun Java Tutorials] (http://java.sun.com/docs/books/tutorial/collections/interfaces/collection.html#Iterator): «Обратите внимание, что' Iterator.remove' является * только * безопасный способ изменения коллекции во время итерации, поведение неуказано, если базовая коллекция модифицируется любым другим способом, пока выполняется итерация ». –

+1

@bears: так ли солнце писал класс ListIterator или кто-то еще? если солнце написало это, ясно, что утверждение ложно. – sepiroth

0

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

+0

Он должен был бы вызвать предыдущий() дважды, так как первый предыдущий() фактически вернет новый элемент, а next() выберет его после. –

+1

нравится быть способным вырастить LL в направлении, которое я ищу? Я согласен :( – sepiroth

+1

@Jim Garrison Нет, первый 'previous()' возвращает новый элемент и устанавливает курсор * перед * так, что последующий вызов 'next()' будет возвращать то же самое. Из Javadoc: Обратите внимание, что чередующиеся вызовы следующего и предыдущего будут возвращать один и тот же элемент повторно. – ColinD

Смежные вопросы