Трюк тут - визначення "зворотного". Можна змінити список на місці, створити копію у зворотному порядку або створити перегляд у зворотному порядку.
Найпростіший, інтуїтивно кажучи , такий 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)
замість цього.
Третій варіант - створити подання у зворотному порядку . Це більш складне рішення і гідне подальшого читання / власне питання. Метод списків Гуави # зворотний - це життєздатна відправна точка.
Вибір "найпростішої" реалізації залишається читачем як вправа.