Почему итератор не имеет метода сброса? - PullRequest
31 голосов
/ 07 октября 2011

Почему?А как лучше всего переместить указатель элементов итератора на первую позицию?

Ответы [ 5 ]

34 голосов
/ 07 октября 2011

Почему?

Потому что, если вы заставите итератор иметь метод сброса, у каждого итератора должен быть метод сброса. Это дает каждому писателю-итератору дополнительную работу. Кроме того, некоторые итераторы очень трудно (или очень дорого) сбрасывать, и вы не хотели бы, чтобы пользователи вызывали сброс для них. Хорошие примеры - итераторы для файлов или потоков.

Как лучше всего переместить указатель элементов итератора на первую позицию?

Создать новый итератор. Это редко дороже, чем сброс.

6 голосов
/ 07 октября 2011

После прочтения потока вы не можете перечитать его, не открывая источник снова.Так работают потоки и итераторы.

3 голосов
/ 07 октября 2011

Это общая тенденция, принятая в JCF - сохранить интерфейс минималистичным, если только это не делает некоторые функции чрезвычайно сложными для работы.Это причина, по которой у вас нет отдельных интерфейсов для семантики, таких как неизменяемые коллекции, коллекции фиксированного размера.

Относительно того, почему тогда предоставляется remove(Object) (необязательно).невозможно безопасно удалить элемент из коллекции во время итерации по коллекции - нет ничего, что делает обязательным предоставление reset().

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

3 голосов
/ 07 октября 2011

Лучший способ - создать новый!

2 голосов
/ 06 мая 2016

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

Пример в Scala (Java похожа, но у меня нет под рукой Java REPL)

def i = (1 to 100) iterator   // i is our iterator
i.grouped(50) foreach println // prints two groups
i.grouped(50) foreach println // prints same two groups again
...