Почему? И как лучше всего переместить указатель элементов итератора в первую позицию?
Почему у итератора нет метода сброса?
Ответы:
Почему?
Потому что, если вы заставляете итератор иметь метод сброса, каждый итератор должен иметь метод сброса. Это дает каждому автору итератора дополнительную работу. Кроме того, некоторые итераторы очень сложно (или очень дорого) сбросить, и вы бы не хотели, чтобы пользователи вызывали для них сброс. Хорошими примерами являются итераторы файлов или потоков.
как лучше всего переместить указатель элементов итератора в первую позицию?
Создайте новый итератор. Это редко бывает дороже, чем сброс.
Однажды прочитав поток, вы не сможете перечитать его, не открывая исходный код снова. Так работают потоки и итераторы.
Лучший способ создать новый!
Это общая тенденция, принятая в JCF — сохранять минималистичный интерфейс, если только это не делает работу некоторых функций чрезвычайно сложной. Именно по этой причине у вас нет отдельных интерфейсов для семантики, таких как неизменяемые коллекции, коллекции фиксированного размера.
Что касается того, почему тогда предоставляется remove(Object)
(как необязательный). Непредоставление этого сделало бы невозможным безопасное удаление элемента из коллекции при повторении коллекции - нет ничего, что делало бы предоставление reset()
таким обязательным.
Опять же, почему существует отдельный ListIterator()
(предоставляющий такие методы, как previous()
и previousIndex()
) - с интерфейсом List
основной функциональностью при его использовании является возможность компоновки элементов по индексу и возможность доступа к ним с помощью index-order , будь то фиксированный или случайный порядок. Это не относится к другим коллекциям. Отсутствие этого интерфейса для List
сделает очень трудной, если не невозможной, плавную работу со списком.
Iteratable
и Iterator
, которые могли бы быть включены в интерфейс, но не были включены. Полезные методы итератора включают skip
[эквивалентно N последовательным вызовам перемещения, хотя многие итераторы могут реализовать его за время O(1)] и copyLocation
[который вернет итератор, который, как ожидается, выдаст те же элементы, что и исходный]. Любой итератор может реализовать метод skip
, а любой не очень большой конечный итератор может реализовать copyLocation
, перечислив себя в массив, а затем имея и его, и копию... 30.04.2015 Совет: вместо этого создайте переменную итератора как функцию, после чего вы сможете использовать ее столько раз, сколько захотите. Это работает только в том случае, если базовая логика повторяема.
Пример на 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
remove
, который не на самом деле дает дополнительную работу всем итераторам, поскольку эта операция необязательна.) 07.10.2011