Я перемещаю кусок кода, чтобы использовать дженерики. Одним из аргументов для этого является то, что цикл for гораздо чище, чем отслеживание индексов или использование явного итератора.
Примерно в половине случаев список (ArrayList) итерируется в обратном порядке с использованием индекса сегодня.
Может кто-нибудь предложить более чистый способ сделать это (так как мне не нравится indexed for loop
при работе с коллекциями), хотя это работает?
for (int i = nodes.size() - 1; i >= 0; i--) {
final Node each = (Node) nodes.get(i);
...
}
Примечание: я не могу добавить какие-либо новые зависимости вне JDK.
java
collections
Аллен Лалонд
источник
источник
for (int i = nodes.size(); --i >= 0;)
Ответы:
Попробуй это:
источник
listIterator
звонке, я думаю.Iterator
что используетListIterator
в обратном порядке, но это может не стоить одного цикла.for (Node each : new ListReverse<Node>(nodes)) { }
Гуава предлагает
Lists#reverse(List)
иImmutableList#reverse()
. Как и в большинстве случаев для Гуавы, первый делегирует второму, если аргумент является аргументомImmutableList
, так что вы можете использовать первый во всех случаях. Они не создают новые копии списка, а просто «обращают взгляды» на него.пример
источник
Я не думаю, что это возможно, используя синтаксис цикла for. Единственное, что я могу предложить, это сделать что-то вроде:
... но я бы не сказал, что это "чище", учитывая, что оно будет менее эффективным.
источник
Вариант 1. Задумывались ли вы о реверсе списка с коллекциями # reverse () и последующем использовании foreach?
Конечно, вы также можете реорганизовать свой код так, чтобы список был упорядочен правильно, чтобы вам не пришлось его менять, что требует дополнительного пространства / времени.
РЕДАКТИРОВАТЬ:
Вариант 2: в качестве альтернативы, вы могли бы использовать Deque вместо ArrayList? Это позволит вам перебирать вперед и назад
РЕДАКТИРОВАТЬ:
Вариант 3: Как предлагали другие, вы можете написать Итератор, который будет проходить по списку в обратном порядке, вот пример:
источник
descendingIterator()
.for each
выражения является наиболее идиоматическим решением на мой взгляд. Приятно осознавать, что это возможно, если ваш список реализует Iterable таким образом, что он повторяется в обратном направлении. Я собираюсь использовать этот подход и использовать класс ReverseListIterator из коллекций Apache Commons.Вы можете использовать конкретный класс
LinkedList
вместо общего интерфейсаList
. Тогда у вас естьdescendingIterator
для итерации с обратным направлением.Не знаю, почему нет
descendingIterator
сArrayList
...источник
Это старый вопрос, но ему не хватает java8-дружественного ответа. Вот несколько способов перебрать список с помощью Streaming API:
источник
Вот (непроверенная) реализация
ReverseIterable
. Когдаiterator()
вызывается он создает и возвращает личноеReverseIterator
выполнение, которое просто отображает вызовы наhasNext()
наhasPrevious()
и вызовыnext()
сопоставленные сprevious()
. Это означает, что вы можете выполнить итерациюArrayList
в обратном порядке следующим образом:Определение класса
источник
ReverseIterator
отсутствует необходимый конструктор, и код следует использоватьList
вместоArrayList
.Если списки довольно малы, так что производительность не является реальной проблемой, можно использовать метод
reverse
-classLists
вGoogle Guava
.for-each
Получает довольно -код, и оригинальный список остается прежним. Кроме того, обратный список поддерживается исходным списком, поэтому любые изменения исходного списка будут отражены в обратном.Дает следующий результат:
Это означает, что обратная итерация myList может быть записана как:
источник
Создать кастом
reverseIterable
.источник
Очень простой пример:
источник
Вы могли бы использовать
ReverseListIterator
из Apache Commons-Collections:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/iterators/ReverseListIterator.html
источник
Также найден обратный метод коллекций Google .
источник
Чтобы иметь код, который выглядит так:
Поместите этот код в файл с именем «In.java»:
источник
listIterator
поле должно быть внутриIterator
реализации, а неIterable
реализации.name()
метод,ordinal()
метод иstatic valueOf()
метод, например.Как было предложено, по крайней мере, дважды, вы можете использовать
descendingIterator
сDeque
, в частности сLinkedList
. Если вы хотите использовать цикл for-each (то есть иметь anIterable
), вы можете создать и использовать обертку следующим образом:источник
Причина: «Не знаю, почему нет никакого нисходящего Итератора с ArrayList ...»
Поскольку список массивов не сохраняет список в том же порядке, в котором данные были добавлены в список. Поэтому никогда не используйте Arraylist.
Связанный список будет хранить данные в том же порядке ДОБАВИТЬ в список.
Итак, выше, в моем примере, я использовал ArrayList (), чтобы заставить пользователя крутить свои мысли и заставлять их тренировать что-то со своей стороны.
Вместо этого
ОБЛАСТЬ ПРИМЕНЕНИЯ:
источник