Ketentuan: jangan memodifikasi daftar asli; Hanya JDK, tidak ada perpustakaan eksternal. Poin bonus untuk versi satu-liner atau JDK 1.3.
Apakah ada cara yang lebih sederhana daripada:
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
Jawaban:
Di Jawa 8:
sumber
List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).distinct().collect(Collectors.toList());
Stream.of(listOne, listTwo).flatMap(Collection::stream).collect(Collectors.toList())
Dari atas kepala saya, saya dapat mempersingkatnya dengan satu baris:
sumber
addAll()
keduanya. Saya mencoba semua yang menyarankan untuk tidak menyalin daftar dan hasilnya ada banyak overhead yang tidak kita butuhkan saat ini.addAll(Collection)
mengembalikan aboolean
.Anda bisa menggunakan pustaka -koleksi Apache commons :
sumber
Salah satu persyaratan Anda adalah mempertahankan daftar asli. Jika Anda membuat daftar baru dan menggunakan
addAll()
, Anda secara efektif menggandakan jumlah referensi ke objek dalam daftar Anda. Ini dapat menyebabkan masalah memori jika daftar Anda sangat besar.Jika Anda tidak perlu mengubah hasil gabungan, Anda dapat menghindari ini menggunakan implementasi daftar kustom. Kelas implementasi kustom lebih dari satu baris, jelas ... tetapi menggunakannya pendek dan manis.
CompositeUnmodifiableList.java:
Pemakaian:
sumber
Collections.unmodifiableList()
metode, yang membungkus daftar untuk membuatnya tidak dapat dimodifikasi.CompositeUnmodifiableList
melakukan hal yang sama, kecuali membungkus dua daftar dan memberikan tampilan gabungan. Semua poin yang Anda buatCompositeUnmodifiableList
juga berlakuCollections.unmodifiableList()
juga.List<? extends E>
Mungkin tidak sederhana, tetapi menarik dan jelek:
Jangan menggunakannya dalam kode produksi ...;)
sumber
Satu baris Java 8 lainnya:
Sebagai bonus, karena
Stream.of()
variadik, Anda dapat menggabungkan daftar sebanyak yang Anda suka.sumber
x -> x.stream()
bisa diganti denganCollection::stream
.List::stream
.Tidak sederhana, tetapi tanpa mengubah ukuran overhead:
sumber
Menemukan pertanyaan ini mencari untuk menggabungkan jumlah daftar sewenang-wenang, tidak mengurus perpustakaan eksternal. Jadi, mungkin itu akan membantu orang lain:
Berguna jika Anda ingin menerapkan logika yang sama ke sejumlah koleksi berbeda dalam satu untuk ().
sumber
com.google.common.collect.Iterators#concat(java.util.Iterator<? extends java.util.Iterator<? extends T>>)
alih-alihIterables#concat()
; karena nanti masih menyalin elemen ke tautan temp!Solusi yang diusulkan adalah untuk tiga daftar meskipun itu dapat diterapkan untuk dua daftar juga. Di Java 8 kita dapat menggunakan Stream.of atau Stream.concat sebagai:
Stream.concat
mengambil dua aliran sebagai input dan menciptakan aliran gabungan yang malas yang elemen-elemennya adalah semua elemen dari aliran pertama diikuti oleh semua elemen dari aliran kedua. Karena kami memiliki tiga daftar, kami telah menggunakan metode ini (Stream.concat
) dua kali.Kami juga dapat menulis kelas utilitas dengan metode yang mengambil sejumlah daftar (menggunakan varargs ) dan mengembalikan daftar gabungan sebagai:
Maka kita dapat menggunakan metode ini sebagai:
sumber
Berikut ini adalah solusi java 8 menggunakan dua baris:
Sadarilah bahwa metode ini tidak boleh digunakan jika
newList
tidak diketahui dan mungkin sudah dibagikan dengan utas lainnyanewList
adalah aliran paralel dan akses kenewList
tidak disinkronkan atau threadsafekarena pertimbangan efek samping.
Kedua kondisi di atas tidak berlaku untuk kasus menggabungkan dua daftar di atas, jadi ini aman.
Berdasarkan jawaban ini untuk pertanyaan lain.
sumber
newList
itu tidak dapat diamati oleh utas lainnya. Tetapi Anda benar bahwa ini mungkin tidak boleh dilakukan jika tidak diketahui dari mana nilainewList
berasal (misalnya jikanewList
disahkan sebagai parameter..forEach(newList::addAll);
bukannya.collect(Collectors.toList());
?List<List<Object>>
. Apa yang mungkin ada dalam pikiran Anda adalah sesuatu seperti ini: stackoverflow.com/questions/189559/…flatMap
.Ini sederhana dan hanya satu baris, tetapi akan menambahkan konten listTwo ke listOne. Apakah Anda benar-benar perlu memasukkan konten ke daftar ketiga?
sumber
Sedikit lebih sederhana:
sumber
List
Struktur membebankan ada kendala keunikan. Anda dapat menghapus dupes dengan melakukan hal yang sama dengan set.Set<String> newSet = new HashSet<>(setOne); newSet.addAll(setTwo);
Sedikit lebih pendek adalah:
sumber
Anda dapat membuat metode utilitas Java 8 generik untuk menyelesaikan sejumlah daftar .
sumber
Anda dapat melakukan oneliner jika daftar target sudah ditentukan sebelumnya.
sumber
Di Java 8 (sebaliknya):
sumber
solusi satu liner lainnya menggunakan
Java8
stream, karenaflatMap
solusi sudah diposting, berikut adalah solusi tanpaflatMap
atau
kode
keluaran
sumber
flatMap
, karena daftar hanya diulang sekali ketika mereka dikumpulkanYang paling cerdas menurut saya:
sumber
@SafeVarargs
!Anda bisa melakukannya dengan impor statis dan kelas pembantu
nb generifikasi kelas ini mungkin dapat ditingkatkan
Maka Anda dapat melakukan hal-hal seperti
sumber
Versi Java 8 dengan dukungan untuk bergabung dengan kunci objek:
sumber
sumber
Gunakan kelas Helper.
Saya menyarankan:
sumber
sumber
Kita dapat bergabung dengan 2 daftar menggunakan java8 dengan 2 pendekatan.
1) Menggunakan concat:
2) Menggunakan flatMap:
sumber
Hampir semua jawaban menyarankan untuk menggunakan ArrayList.
Lebih suka menggunakan LinkedList untuk operasi penambahan yang efisien.
ArrayList add adalah O (1) diamortisasi, tetapi O (n) terburuk karena array harus diubah ukurannya dan disalin. Sedangkan LinkedList add selalu konstan O (1).
info lebih lanjut https://stackoverflow.com/a/322742/311420
sumber
Saya tidak mengklaim bahwa itu sederhana, tetapi Anda menyebutkan bonus untuk satu-liner ;-)
sumber
Tidak jauh dari one-liner, tapi saya pikir ini yang paling sederhana:
sumber
Berikut ini pendekatan menggunakan stream dan java 8 jika daftar Anda memiliki tipe yang berbeda dan Anda ingin menggabungkannya ke daftar tipe lain.
sumber
Jika Anda ingin melakukan ini secara statis, Anda dapat mengikuti yang berikut.
Contoh-contoh menggunakan 2 EnumSets dalam urutan alami (== Enum-urutan)
A, B
dan bergabung kemudian dalamALL
daftar.sumber
sumber