Kuncinya di sini adalah mendefinisikan "terbalik". Orang dapat mengubah daftar di tempat, membuat salinan dalam urutan terbalik, atau membuat tampilan dalam urutan terbalik.
Cara paling sederhana, secara intuitif , adalah Collections.reverse
:
Collections.reverse(myList);
Metode ini mengubah daftar di tempat . Artinya, Collections.reverse
ambil daftar dan timpa elemen-elemennya, tanpa meninggalkan salinan yang tidak dapat dikembalikan. Ini cocok untuk beberapa kasus penggunaan, tetapi tidak untuk yang lain; lebih jauh, ia mengasumsikan bahwa daftar dapat dimodifikasi. Jika ini dapat diterima, kami baik-baik saja.
Jika tidak, seseorang dapat membuat salinan dengan urutan terbalik :
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
Pendekatan ini bekerja, tetapi membutuhkan iterasi daftar dua kali. Copy constructor ( new ArrayList<>(list)
) berulang di atas daftar, dan begitu juga Collections.reverse
. Kami dapat menulis ulang metode ini untuk mengulangi sekali saja, jika kami cenderung:
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;
}
Ini lebih efisien, tetapi juga lebih bertele-tele.
Atau, kita dapat menulis ulang di atas untuk menggunakan Java 8's stream
API, yang beberapa orang menemukan lebih ringkas dan dapat dibaca daripada yang di atas:
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
}
nb. yang Collectors.toList()
membuat sangat sedikit jaminan tentang daftar hasil. Jika Anda ingin memastikan hasilnya kembali sebagai ArrayList, gunakan Collectors.toCollection(ArrayList::new)
saja.
Opsi ketiga adalah membuat tampilan dalam urutan terbalik . Ini adalah solusi yang lebih rumit, dan layak dibaca lebih lanjut / pertanyaannya sendiri. Metode terbalik # Daftar Guava adalah titik awal yang layak.
Memilih implementasi yang "paling sederhana" dibiarkan sebagai latihan bagi pembaca.