Какой самый простой способ отменить этот ArrayList?
ArrayList<Integer> aList = new ArrayList<>();
//Add elements to ArrayList object
aList.add("1");
aList.add("2");
aList.add("3");
aList.add("4");
aList.add("5");
while (aList.listIterator().hasPrevious())
Log.d("reverse", "" + aList.listIterator().previous());
Не самый простой способ, но если вы поклонник рекурсии, вас может заинтересовать следующий метод для обращения к ArrayList:
Или не рекурсивно:
источник
int j
обновляется с каждой итерацией? Вы инициализируете его,j = list.size() - 1
но я не думаю, что раздел инициализацииfor loop
обновляется с каждой итерацией, не так ли?IndexOutOfBoundsException
так как пытаетесь получить доступj
(последний индекс исходного ArrayList), но вы уже удалили объект с этим индексом?add()
толкает другие элементы вниз по массиву, поэтому массив остается практически неизменным. Интересные решения, спасибо!Хитрость здесь в том, чтобы определить «реверс». Можно изменить список на месте, создать копию в обратном порядке или создать представление в обратном порядке.
Самый простой способ, интуитивно говоря , это
Collections.reverse
:Этот метод изменяет список на месте . То есть
Collections.reverse
берет список и перезаписывает его элементы, не оставляя необратимой копии. Это подходит для некоторых случаев использования, но не для других; более того, предполагается, что список можно изменить. Если это приемлемо, у нас все хорошо.Если нет, можно создать копию в обратном порядке :
Этот подход работает, но требует итерации по списку дважды. Конструктор копирования (
new ArrayList<>(list)
) выполняет итерации по спискуCollections.reverse
. Мы можем переписать этот метод, чтобы повторить только один раз, если мы так склонны:Это более эффективно, но и более многословно.
В качестве альтернативы, мы можем переписать вышеупомянутое, чтобы использовать
stream
API Java 8 , который некоторые люди находят более кратким и разборчивым, чем выше:в северном направлении это
Collectors.toList()
дает очень мало гарантий относительно списка результатов. Если вы хотите, чтобы результат вернулся в виде ArrayList, используйтеCollectors.toCollection(ArrayList::new)
вместо этого.Третий вариант - создать представление в обратном порядке . Это более сложное решение и заслуживает дальнейшего чтения / своего вопроса. Метод обратного отображения списков в Guava - жизнеспособная отправная точка.
Выбор «простейшей» реализации оставлен читателю в качестве упражнения.
источник
Решение без использования дополнительного ArrayList или комбинации методов add () и remove (). Оба могут оказать негативное влияние, если вам придется перевернуть огромный список.
источник
источник
Реверсивный ArrayList рекурсивным способом и без создания нового списка для добавления элементов:
источник
На всякий случай, если мы используем Java 8 , тогда мы можем использовать Stream. ArrayList - это список с произвольным доступом, и мы можем получить поток элементов в обратном порядке, а затем собрать его в новый
ArrayList
.Вышеупомянутый подход не подходит для LinkedList, так как это не произвольный доступ. Мы также можем использовать
instanceof
для проверки.источник
Мы также можем сделать то же самое, используя Java 8.
источник
Чуть более читабельным :)
источник
Еще одно рекурсивное решение
источник