Хитрость здесь в определении "обратного". Можно изменить список на месте, создать копию в обратном порядке или создать представление в обратном порядке.
Самый простой способ, интуитивно говоря, это Collections.reverse:
Collections.reverse(myList);
Этот метод изменяет список на месте. То есть, Collections.reverse берет список и перезаписывает его элементы, не оставляя после себя неотправленной копии. Это подходит для некоторых вариантов использования, но не для других; более того, предполагается, что список можно изменять. Если это приемлемо, то все в порядке.
Если нет, можно создать копию в обратном порядке:
static <T> List<T> reverse(final List<T> list) { final List<T> result = newArrayList<>(list); Collections.reverse(result); return result; }
Этот подход работает, но требует повторения списка дважды. Конструктор копирования (new ArrayList<>(list)) выполняет повторение списка, и то же самое делает Collections.reverse. Мы можем переписать этот метод так, чтобы он выполнял итерацию только один раз, если нам так хочется:
// create a new list, with exactly enough initial capacity to hold the (reversed) list final List<T> result = newArrayList<>(size);
// iterate through the list in reverse order and append to the result for (inti= last; i >= 0; --i) { finalTelement= 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) { finalintlast= 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: