Saya memigrasi sepotong kode untuk menggunakan obat generik. Salah satu argumen untuk melakukannya adalah bahwa for loop jauh lebih bersih daripada melacak indeks, atau menggunakan iterator eksplisit.
Dalam sekitar setengah kasus, daftar (sebuah ArrayList) sedang diulang dalam urutan terbalik dengan menggunakan indeks hari ini.
Dapatkah seseorang menyarankan cara yang lebih bersih untuk melakukan ini (karena saya tidak suka indexed for loop
ketika bekerja dengan koleksi), meskipun itu berhasil?
for (int i = nodes.size() - 1; i >= 0; i--) {
final Node each = (Node) nodes.get(i);
...
}
Catatan: Saya tidak bisa menambahkan dependensi baru di luar JDK.
java
collections
Allain Lalonde
sumber
sumber
for (int i = nodes.size(); --i >= 0;)
Jawaban:
Coba ini:
sumber
listIterator
telepon, saya pikir.Iterator
yang menggunakanListIterator
terbalik, tetapi itu mungkin tidak layak untuk satu loop.for (Node each : new ListReverse<Node>(nodes)) { }
Jambu biji menawarkan
Lists#reverse(List)
danImmutableList#reverse()
. Seperti dalam kebanyakan kasus untuk Guava, mantan delegasi ke yang terakhir jika argumennya adalahImmutableList
, sehingga Anda dapat menggunakan yang pertama dalam semua kasus. Ini tidak membuat salinan baru dari daftar tetapi hanya "pandangan terbalik" darinya.Contoh
sumber
Saya tidak berpikir itu mungkin menggunakan sintaks for loop. Satu-satunya hal yang dapat saya sarankan adalah melakukan sesuatu seperti:
... tapi saya tidak akan mengatakan ini "bersih" mengingat itu akan menjadi kurang efisien.
sumber
Opsi 1: Sudahkah Anda berpikir untuk membalikkan Daftar dengan Koleksi # reverse () dan kemudian menggunakan foreach?
Tentu saja, Anda mungkin juga ingin memperbaiki kode Anda sehingga daftar tersebut dipesan dengan benar sehingga Anda tidak perlu membalikkannya, yang menggunakan ruang / waktu ekstra.
EDIT:
Opsi 2: Atau, dapatkah Anda menggunakan Deque alih-alih ArrayList? Ini akan memungkinkan Anda untuk beralih ke depan dan ke belakang
EDIT:
Opsi 3: Seperti yang disarankan orang lain, Anda bisa menulis Iterator yang akan masuk daftar secara terbalik, berikut adalah contohnya:
sumber
descendingIterator()
.for each
ekspresi adalah solusi paling idiomatis menurut saya. Sangat menyenangkan untuk menyadari bahwa ini dimungkinkan jika Daftar Anda menerapkan Iterable dengan cara yang berulang. Saya akan menggunakan pendekatan ini dan menggunakan kelas ReverseListIterator dari Apache Commons Collections.Anda bisa menggunakan kelas konkret
LinkedList
alih-alih antarmuka umumList
. Maka Anda memilikidescendingIterator
untuk iterasi dengan arah sebaliknya.Tidak tahu mengapa tidak ada
descendingIterator
denganArrayList
...sumber
Ini adalah pertanyaan lama, tetapi tidak memiliki jawaban ramah java8. Berikut adalah beberapa cara membalikkan daftar, dengan bantuan Streaming API:
sumber
Berikut adalah implementasi (belum diuji) dari a
ReverseIterable
. Ketikaiterator()
dipanggil itu membuat dan mengembalikanReverseIterator
implementasi pribadi , yang hanya memetakan panggilanhasNext()
kehasPrevious()
dan panggilan kenext()
dipetakan keprevious()
. Ini berarti Anda dapat beralih secaraArrayList
terbalik sebagai berikut:Definisi kelas
sumber
ReverseIterator
tidak ada konstruktor yang diperlukan dan kode harus digunakanList
sebagai gantinyaArrayList
.Jika daftar tersebut cukup kecil sehingga kinerja bukanlah masalah nyata, orang dapat menggunakan
reverse
-metod dari -classLists
inGoogle Guava
. Menghasilkanfor-each
kode- cantik , dan daftar asli tetap sama. Juga, daftar terbalik didukung oleh daftar asli, sehingga setiap perubahan ke daftar asli akan tercermin dalam daftar terbalik.Menghasilkan hasil sebagai berikut:
Yang berarti bahwa iterasi balik dari myList dapat ditulis sebagai:
sumber
Buat custom
reverseIterable
.sumber
Contoh yang sangat sederhana:
sumber
Anda dapat menggunakan
ReverseListIterator
dari Apache Commons-Collections:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/iterators/ReverseListIterator.html
sumber
Ditemukan juga metode reverse collections google .
sumber
Untuk memiliki kode yang terlihat seperti ini:
Masukkan kode ini ke file yang disebut "In.java":
sumber
listIterator
lapangan harus di dalamIterator
implementasi, bukanIterable
implementasi.name()
metode, metode,ordinal()
danstatic valueOf()
metode, misalnya.Seperti yang telah disarankan setidaknya dua kali, Anda dapat menggunakan
descendingIterator
denganDeque
, khususnya dengan aLinkedList
. Jika Anda ingin menggunakan untuk-setiap loop (yaitu, memilikiIterable
), Anda dapat membuat dan menggunakan pembungkus seperti ini:sumber
Alasan: "Tidak tahu mengapa tidak ada descendingIterator dengan ArrayList ..."
Karena daftar array tidak menyimpan daftar dalam urutan yang sama seperti data telah ditambahkan ke daftar. Jadi, jangan pernah gunakan Arraylist.
Daftar tertaut akan menyimpan data dalam urutan ADD yang sama.
Jadi, di atas dalam contoh saya, saya menggunakan ArrayList () untuk membuat pengguna memutar pikiran mereka dan membuat mereka berolahraga sesuatu dari sisi mereka.
Alih-alih ini
MENGGUNAKAN:
sumber