Asumsikan, saya memiliki sejumlah koleksi (misalnya 3 ArrayLists) sebagai anggota kelas. Sekarang, saya ingin mengekspos semua elemen ke kelas lain sehingga mereka dapat dengan mudah mengulang semua elemen (idealnya, hanya baca). Saya menggunakan koleksi jambu biji dan saya bertanya-tanya bagaimana saya bisa menggunakan iterabel / iterator jambu biji untuk menghasilkan tampilan logis pada koleksi internal tanpa membuat salinan sementara.
java
collections
guava
newgre
sumber
sumber
Jawaban:
Dengan Guava, Anda dapat menggunakannya
Iterables.concat(Iterable<T> ...)
, ini membuat tampilan langsung dari semua iterable, digabungkan menjadi satu (jika Anda mengubah iterable, versi gabungan juga berubah). Kemudian bungkus iterable bersambung denganIterables.unmodifiableIterable(Iterable<T>)
(saya belum melihat persyaratan hanya-baca sebelumnya).Dari
Iterables.concat( .. )
JavaDocs:Meskipun ini tidak secara eksplisit mengatakan bahwa ini adalah tampilan langsung, kalimat terakhir menyiratkan bahwa itu (mendukung
Iterator.remove()
metode hanya jika iterator pendukung mendukungnya tidak mungkin kecuali menggunakan tampilan langsung)Kode sampel:
Keluaran:
Edit:
Berdasarkan Permintaan dari Damian, berikut adalah metode serupa yang mengembalikan Tampilan Koleksi langsung
sumber
Iterables.unmodifiableIterable(iterable)
Iterables.concat
menghasilkanIterable
, bukanCollection
. Saya butuhCollection
pemandangan.size()
adalah yang saya butuhkan.add()
melempar pengecualian itu bagus - Saya tidak peduli dengan metode ini. Collections API rusak dan tidak ada yang bisa berbuat apa-apa.Collection.add()
,,Iterator.remove()
bla.Solusi Plain Java 8 menggunakan file
Stream
.Angka konstan
Dengan asumsi
private Collection<T> c, c2, c3
.Satu solusi:
Solusi lain:
Nomor variabel
Dengan asumsi
private Collection<Collection<T>> cs
:sumber
Jika Anda menggunakan setidaknya Java 8, lihat jawaban saya yang lain .
Jika Anda sudah menggunakan Google Guava, lihat jawaban Sean Patrick Floyd .
Jika Anda terjebak di Java 7 dan tidak ingin menyertakan Google Guava, Anda dapat menulis sendiri (hanya baca)
Iterables.concat()
menggunakan tidak lebih dariIterable
danIterator
:Angka konstan
Nomor variabel
sumber
Anda dapat membuat yang baru
List
dan yangaddAll()
lainList
untuk itu. Kemudian kembalikan daftar yang tidak dapat diubah denganCollections.unmodifiableList()
.sumber
ArrayList
hanya mengalokasikan ruang dan panggilan diSystem.arraycopy()
bawah tenda. Tidak bisa jauh lebih efisien dari itu.Inilah solusi saya untuk itu:
EDIT - ubah kode sedikit
sumber
hasNext()
dannext()
. Yang pertama mengubah status iterator Anda sedangkan yang kedua tidak. Seharusnya sebaliknya. Meneleponnext()
tanpa meneleponhasNext()
akan selalu berhasilnull
. MeneleponhasNext()
tanpa meneleponnext()
akan membuang elemen. Andanext()
juga tidak melemparNoSuchElementException
, melainkan kembalinull
.