Подтвердить что ты не робот

Почему у итератора нет метода reset?

Почему? И какой лучший способ переместить элементы итератора указатель на первую позицию?

4b9b3361

Ответ 1

Почему?

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

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

Создайте новый итератор. Он редко дороже, чем reset.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Пример в 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