Apa cara paling sederhana untuk membalikkan ArrayList ini?
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());
Bukan cara paling sederhana tetapi jika Anda adalah penggemar rekursi Anda mungkin tertarik pada metode berikut untuk membalikkan ArrayList:
Atau non-rekursif:
sumber
int j
diperbarui dengan setiap iterasi? Anda menginisialisasij = list.size() - 1
tetapi saya tidak berpikir bahwa bagian inisialisasifor loop
akan diperbarui dengan setiap iterasi melakukannya?IndexOutOfBoundsException
karena Anda mencoba mengaksesj
(indeks terakhir dari ArrayList asli) tetapi Anda sudah menghapus objek pada indeks itu?add()
mendorong elemen-elemen lain ke dalam array, jadi array tetap pada dasarnya ukuran konstan. Solusi menarik, terima kasih!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
: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 :
Pendekatan ini bekerja, tetapi membutuhkan iterasi daftar dua kali. Copy constructor (
new ArrayList<>(list)
) berulang di atas daftar, dan begitu jugaCollections.reverse
. Kami dapat menulis ulang metode ini untuk mengulangi sekali saja, jika kami cenderung: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:nb. yang
Collectors.toList()
membuat sangat sedikit jaminan tentang daftar hasil. Jika Anda ingin memastikan hasilnya kembali sebagai ArrayList, gunakanCollectors.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.
sumber
Solusi tanpa menggunakan ArrayList tambahan atau kombinasi metode add () dan remove (). Keduanya dapat memiliki dampak negatif jika Anda harus membalik daftar besar.
sumber
sumber
Membalik ArrayList dengan cara rekursif dan tanpa membuat daftar baru untuk menambahkan elemen:
sumber
Kalau-kalau kita menggunakan Java 8 , maka kita bisa menggunakan Stream. ArrayList adalah daftar akses acak dan kita bisa mendapatkan aliran elemen dalam urutan terbalik dan kemudian mengumpulkannya menjadi yang baru
ArrayList
.Pendekatan di atas tidak cocok untuk LinkedList karena itu bukan akses acak. Kami juga dapat menggunakan
instanceof
untuk memeriksa.sumber
Kita juga bisa melakukan hal yang sama menggunakan java 8.
sumber
Sedikit lebih mudah dibaca :)
sumber
Solusi rekursif lain
sumber