Android

What is the Simplest Way to Reverse an ArrayList?

Какой самый простой способ изменить ArrayList?

Какой самый простой способ изменить этот 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());
Переведено автоматически
Ответ 1
Collections.reverse(aList);

Пример (Ссылка):

ArrayList aList = new ArrayList();
//Add elements to ArrayList object
aList.add("1");
aList.add("2");
aList.add("3");
aList.add("4");
aList.add("5");
Collections.reverse(aList);
System.out.println("After Reverse Order, ArrayList Contains : " + aList);
Ответ 2

Хитрость здесь в определении "обратного". Можно изменить список на месте, создать копию в обратном порядке или создать представление в обратном порядке.

Самый простой способ, интуитивно говоря, это Collections.reverse:

Collections.reverse(myList);

Этот метод изменяет список на месте. То есть, Collections.reverse берет список и перезаписывает его элементы, не оставляя после себя неотправленной копии. Это подходит для некоторых вариантов использования, но не для других; более того, предполагается, что список можно изменять. Если это приемлемо, то все в порядке.


Если нет, можно создать копию в обратном порядке:

static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}

Этот подход работает, но требует повторения списка дважды. Конструктор копирования (new ArrayList<>(list)) выполняет повторение списка, и то же самое делает Collections.reverse. Мы можем переписать этот метод так, чтобы он выполнял итерацию только один раз, если нам так хочется:

static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;

// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);

// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}

// result now holds a reversed copy of the original list
return result;
}

Это более эффективно, но и более подробно.

В качестве альтернативы, мы можем переписать вышесказанное, чтобы использовать stream API Java 8, который некоторые люди считают более кратким и разборчивым, чем приведенный выше:

static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}

примечание. это Collectors.toList() дает очень мало гарантий в отношении результирующего списка. Если вы хотите убедиться, что результат возвращается в виде ArrayList, используйте Collectors.toCollection(ArrayList::new) вместо этого.


Третий вариант - создать представление в обратном порядке. Это более сложное решение, заслуживающее дальнейшего прочтения / это отдельный вопрос. Метод Guava Lists#reverse является жизнеспособной отправной точкой.

Выбор "простейшей" реализации оставлен в качестве упражнения для читателя.

Ответ 3

Не самый простой способ, но если вы поклонник рекурсии, вас может заинтересовать следующий метод обращения ArrayList:

public ArrayList<Object> reverse(ArrayList<Object> list) {
if(list.size() > 1) {
Object value = list.remove(0);
reverse(list);
list.add(value);
}
return list;
}

Или нерекурсивно:

public ArrayList<Object> reverse(ArrayList<Object> list) {
for(int i = 0, j = list.size() - 1; i < j; i++) {
list.add(i, list.remove(j));
}
return list;
}
Ответ 4
ArrayList<Integer> myArray = new ArrayList<Integer>();

myArray.add(1);
myArray.add(2);
myArray.add(3);

int reverseArrayCounter = myArray.size() - 1;

for (int i = reverseArrayCounter; i >= 0; i--) {
System.out.println(myArray.get(i));
}
2024-02-01 17:10 java android arraylist