Saya perlu menjalankan Daftar dalam urutan terbalik menggunakan Java.
Jadi di mana ini dilakukan:
for(String string: stringList){
//...do something
}
Apakah ada beberapa cara untuk mengulangi stringList dalam urutan terbalik menggunakan untuk setiap sintaks?
Untuk kejelasan: Saya tahu bagaimana cara mengulang daftar dalam urutan terbalik tetapi ingin tahu (demi rasa ingin tahu) bagaimana melakukannya dalam setiap gaya.
Set
koleksi turunan.foreach
menjamin iterasi dalam urutan iterator yang dikembalikan dariiterator()
metode pengumpulan. docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.htmlJawaban:
Metode Collections.reverse sebenarnya mengembalikan daftar baru dengan elemen-elemen dari daftar asli disalin ke dalam urutan terbalik, jadi ini memiliki kinerja O (n) berkaitan dengan ukuran daftar asli.
Sebagai solusi yang lebih efisien, Anda dapat menulis dekorator yang menyajikan pandangan terbalik dari Daftar sebagai Iterable. Iterator yang dikembalikan oleh dekorator Anda akan menggunakan ListIterator dari daftar yang dihiasi untuk berjalan di atas elemen dalam urutan terbalik.
Sebagai contoh:
Dan Anda akan menggunakannya seperti:
sumber
Untuk daftar, Anda dapat menggunakan Perpustakaan Google Guava :
Catatan yang tidak membalikkan seluruh koleksi, atau melakukan hal seperti itu - itu hanya memungkinkan iterasi dan akses acak, dalam urutan terbalik. Ini lebih efisien daripada membalikkan koleksi terlebih dahulu.
Lists.reverse
Untuk membalikkan iterable yang sewenang-wenang, Anda harus membaca semuanya dan kemudian "memutar ulang" itu mundur.
(Jika Anda belum menggunakannya, saya benar-benar akan merekomendasikan Anda melihat Guava . Ini hal yang hebat.)
sumber
Daftar (tidak seperti Perangkat) adalah koleksi yang dipesan dan iterasi dari itu memang mempertahankan pesanan dengan kontrak. Saya akan mengharapkan Stack untuk beralih dalam urutan terbalik tapi sayangnya tidak. Jadi solusi paling sederhana yang dapat saya pikirkan adalah ini:
Saya menyadari bahwa ini bukan solusi loop "untuk setiap". Saya lebih suka menggunakan for for daripada memperkenalkan perpustakaan baru seperti Google Collections.
Collections.reverse () juga melakukan pekerjaan tetapi memperbarui daftar yang bertentangan dengan mengembalikan salinan dalam urutan terbalik.
sumber
for each
sintaksisIni akan berantakan dengan daftar asli dan juga perlu dipanggil di luar loop. Anda juga tidak ingin melakukan pembalikan setiap kali Anda mengulang - apakah itu benar jika salah satu
Iterables.reverse ideas
diterapkan?sumber
AFAIK tidak ada jenis "reverse_iterator" standar di pustaka standar yang mendukung sintaks untuk masing-masing yang sudah menjadi gula sintaksis yang mereka bawa terlambat ke dalam bahasa.
Anda dapat melakukan sesuatu seperti untuk (elemen Item: myList.clone (). Reverse ()) dan membayar harga yang terkait.
Ini juga tampaknya cukup konsisten dengan fenomena yang tampak tidak memberikan Anda cara mudah untuk melakukan operasi mahal - karena daftar, menurut definisi, dapat memiliki kompleksitas akses acak O (N) (Anda dapat mengimplementasikan antarmuka dengan satu-link), membalikkan iterasi bisa menjadi O (N ^ 2). Tentu saja, jika Anda memiliki ArrayList, Anda tidak membayar harga itu.
sumber
Ini mungkin opsi. Berharap ada cara yang lebih baik untuk memulai dari elemen terakhir daripada loop sementara sampai akhir.
sumber
Pada komentar : Anda harus dapat menggunakan Apache Commons
ReverseListIterator
Seperti yang dikatakan @rogerdpack , Anda harus membungkusnya
ReverseListIterator
sebagaiIterable
.sumber
Bukan tanpa menulis beberapa kode khusus yang akan memberi Anda enumerator yang akan membalikkan elemen untuk Anda.
Anda harus dapat melakukannya di Jawa dengan membuat implementasi kustom Iterable yang akan mengembalikan elemen dalam urutan terbalik.
Kemudian, Anda akan instantiate wrapper (atau memanggil metode, apa-punya-Anda) yang akan mengembalikan implementasi Iterable yang membalikkan elemen di dalam untuk setiap loop.
sumber
Anda dapat menggunakan kelas Koleksi http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html untuk membalik daftar lalu loop.
sumber
Anda harus membalikkan koleksi Anda jika Anda ingin menggunakan untuk setiap sintaks di luar kotak dan pergi dalam urutan terbalik.
sumber
Semua jawaban di atas hanya memenuhi persyaratan, baik dengan membungkus metode lain atau memanggil beberapa kode asing di luar;
Berikut adalah solusi yang disalin dari Thinking in Java edisi ke 4 , bab 11.13.1 AdapterMethodIdiom ;
Ini kodenya:
sumber
int current = size() - 1
benar? mengapa tidakint current = this.size() - 1
atauint current = super.size() - 1
A Work Around:
Atau dengan jambu biji :
sumber
Jelas merupakan jawaban yang terlambat untuk pertanyaan ini. Salah satu kemungkinan adalah menggunakan ListIterator dalam for for loop. Ini tidak sebersih sintaksis titik dua, tetapi bekerja.
Kredit untuk sintaksis ListIterator masuk ke "Cara untuk mengulangi daftar di Jawa"
sumber