Saya ingin memiliki tampilan daftar terbalik pada daftar (dengan cara yang sama daripada List#sublist
memberikan tampilan sublist pada daftar). Apakah ada beberapa fungsi yang menyediakan fungsi ini?
Saya tidak ingin membuat salinan apa pun dari daftar atau memodifikasi daftar.
Akan cukup jika saya bisa mendapatkan setidaknya iterator terbalik pada daftar dalam kasus ini.
Juga, saya tahu cara mengimplementasikan ini sendiri. Saya hanya bertanya apakah Java sudah menyediakan sesuatu seperti ini.
Implementasi demo:
static <T> Iterable<T> iterableReverseList(final List<T> l) {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
ListIterator<T> listIter = l.listIterator(l.size());
public boolean hasNext() { return listIter.hasPrevious(); }
public T next() { return listIter.previous(); }
public void remove() { listIter.remove(); }
};
}
};
}
Saya baru tahu bahwa beberapa List
implementasi memiliki descendingIterator()
apa yang saya butuhkan. Meskipun tidak ada implementasi seperti umum untuk List
. Yang agak aneh karena implementasi yang saya lihat di LinkedList
cukup umum untuk bekerja dengan siapa pun List
.
Collections.reverse(list)
Jawaban:
Guava menyediakan ini: Lists.reverse (Daftar)
Tidak seperti
Collections.reverse
ini, ini murni pemandangan ... itu tidak mengubah urutan elemen dalam daftar asli. Selain itu, dengan daftar asli yang dapat dimodifikasi, perubahan pada daftar asli dan tampilan tercermin dalam yang lain.sumber
List
) yang sama tetapi tanpa metode sebaliknya. menghapusnya membuat jambu tersedia lagi.ListIterator.previous()
Gunakan metode .clone () pada Daftar Anda. Ini akan mengembalikan salinan dangkal, yang berarti akan berisi pointer ke objek yang sama, sehingga Anda tidak perlu menyalin daftar. Kemudian gunakan saja Koleksi.
Jadi,
Jika Anda menggunakan
List
dan tidak memiliki akses,clone()
Anda dapat menggunakansubList()
:sumber
clone()
biasanya akan membuat salinan daftar. LagiList#clone()
pula , juga tidak ada.clone()
. Memang memang salinan lengkap dari daftar (itu hanya tidak mengkloning setiap objek tunggal dalam daftar tapi itu tidak pernah apa yang saya bicarakan).subList
tidak menyalin, itu hanya memberikan tampilan pada daftar yang mendasarinya, oleh karena itu membalikkan tampilan ini akan membalikkan daftar yang mendasarinya.Jika saya mengerti benar maka itu adalah satu baris kode. Ini bekerja untuk saya.
sumber
Tidak terlalu elegan, tetapi jika Anda menggunakan List.listIterator (indeks int) Anda bisa mendapatkan ListIterator dua arah ke akhir daftar:
sumber
Collections.reverse (nums) ... Ini sebenarnya membalik urutan elemen. Kode di bawah ini harus dihargai -
Output: 15,94,83,42,61
sumber
java.util.Deque
memilikidescendingIterator()
- jika AndaList
seorangDeque
, Anda dapat menggunakannya.sumber
Saya tahu ini adalah posting lama tapi hari ini saya mencari sesuatu seperti ini. Pada akhirnya saya menulis kode sendiri:
Tidak disarankan untuk Daftar panjang, ini tidak dioptimalkan sama sekali. Ini semacam solusi mudah untuk skenario terkontrol (Daftar yang saya tangani tidak memiliki lebih dari 100 elemen).
Semoga ini bisa membantu seseorang.
sumber
Saya menggunakan ini:
seperti ini:
sumber
Anda juga dapat melakukan ini:
sumber
Anda juga dapat membalik posisi ketika Anda meminta objek:
sumber
Untuk daftar ukuran kecil kita dapat membuat
LinkedList
dan kemudian dapat menggunakan iterator descending sebagai:sumber
Gunakan
reverse(...)
metodejava.util.Collections
kelas. Lulus daftar Anda sebagai parameter dan daftar Anda akan terbalik.sumber