Nano Hash - криптовалюты, майнинг, программирование

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

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


Ответы:


1

Почему?

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

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

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

07.10.2011
  • (За исключением того факта, что существует метод remove, который не на самом деле дает дополнительную работу всем итераторам, поскольку эта операция необязательна.) 07.10.2011
  • @aioobe В некоторых случаях удаление текущего объекта с помощью итератора действительно упрощает жизнь разработчикам. Очень мало случаев, когда это справедливо для сброса (поскольку вы почти всегда можете создать новый итератор). 07.10.2011
  • @DJClayworth Это дает каждому писателю итераторов дополнительную работу. Это не разумный ответ. Разработчикам библиотек нужно приложить немного дополнительных усилий, но в результате многие пользователи библиотек получат выгоду. 14.10.2013
  • Гораздо важнее второй момент, что некоторые итераторы невозможно сбросить. 29.10.2013
  • Что, если итератор является параметром метода? Если я хочу, чтобы изменения в итераторе передавались вызывающему методу... Я просто не могу, верно? 29.04.2015

  • 2

    Однажды прочитав поток, вы не сможете перечитать его, не открывая исходный код снова. Так работают потоки и итераторы.

    07.10.2011

    3

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

    07.10.2011
  • Точно так же, как вы создали предыдущий: Iterator‹T› iterator = iteratable.iterator(); 07.10.2011

  • 4

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

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

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

    07.10.2011
  • Есть несколько вещей, которые можно сделать практически с любыми Iteratable и Iterator, которые могли бы быть включены в интерфейс, но не были включены. Полезные методы итератора включают skip [эквивалентно N последовательным вызовам перемещения, хотя многие итераторы могут реализовать его за время O(1)] и copyLocation [который вернет итератор, который, как ожидается, выдаст те же элементы, что и исходный]. Любой итератор может реализовать метод skip, а любой не очень большой конечный итератор может реализовать copyLocation, перечислив себя в массив, а затем имея и его, и копию... 30.04.2015
  • ... вернуть элементы из этого массива. Клиентский код может сам выполнять любую операцию, но если итератор обладает специальными знаниями о своей внутренней работе, которых нет в клиентском коде, он может использовать эти знания, чтобы предложить улучшения скорости на многие порядки. 30.04.2015

  • 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
    
    05.05.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..