Saya coba dengan loop seperti itu
// ArrayList tourists
for (Tourist t : tourists) {
if (t != null) {
t.setId(idForm);
}
}
Tapi itu tidak baik. Adakah yang bisa menyarankan saya solusi yang lebih baik?
Beberapa tolok ukur yang berguna untuk membuat keputusan yang lebih baik:
Iterator
? Gali java-doc. download.oracle.com/javase/6/docs/api/java/util/…Jawaban:
Mencoba:
Baca API Java . Kode akan dilemparkan
java.lang.UnsupportedOperationException
untuk daftar yang tidak dapat diubah (seperti dibuat denganArrays.asList
); lihat jawaban ini untuk lebih jelasnya.sumber
List.removeAll()
adalah n ^ 2 . Hanya mengatakan.O(n)
bagi saya untuk keduanyaArrayList
danLinkedList
.contains()
loop seluruh array) dan karenasingleton
hanya satu elemen yang akan terjadiN * 1 = N
. Namun umumnya itu akan terjadiN^2
.Pada 2015, ini adalah cara terbaik (Java 8):
Catatan: Kode ini akan digunakan
java.lang.UnsupportedOperationException
untuk daftar dengan ukuran tetap (seperti dibuat dengan Arrays.asList), termasuk daftar yang tidak dapat diubah.sumber
removeIf
adalah yang lebih cepat, tetapi ini hanya dugaan.Arrays.asList
tidak kekal . Ukurannya sudah diperbaiki.sumber
Tidak efisien, tetapi pendek
sumber
Jika Anda lebih suka objek data yang tidak dapat diubah, atau jika Anda tidak ingin merusak daftar input, Anda dapat menggunakan predikat Guava.
sumber
sumber
removeAll(..null..)
. Terima kasih!Pre-Java 8 Anda harus menggunakan:
Penggunaan Post-Java 8:
Alasannya di sini adalah kompleksitas waktu. Masalah dengan array adalah bahwa operasi penghapusan dapat mengambil O (n) waktu untuk menyelesaikannya. Sungguh di Jawa ini adalah salinan array elemen yang tersisa dipindahkan untuk menggantikan tempat kosong. Banyak solusi lain yang ditawarkan di sini akan memicu masalah ini. Yang pertama secara teknis O (n * m) di mana m adalah 1 karena itu adalah nol tunggal: jadi O (n)
Anda harus menghapus semua singleton, secara internal ia melakukan batchRemove () yang memiliki posisi baca dan posisi tulis. Dan mengulang daftar. Ketika menyentuh nol, itu hanya mengulangi posisi baca oleh 1. Ketika mereka sama dengan yang dilewatinya, ketika mereka berbeda itu terus bergerak bersama menyalin nilai-nilai. Kemudian pada akhirnya dipotong untuk ukuran.
Ini secara efektif melakukan ini secara internal:
Yang dapat Anda lihat secara eksplisit adalah operasi O (n).
Satu-satunya hal yang bisa lebih cepat adalah jika Anda mengulang daftar dari kedua ujungnya, dan ketika Anda menemukan nol, Anda menetapkan nilainya sama dengan nilai yang Anda temukan di akhir, dan mengurangi nilai itu. Dan diulang sampai dua nilai cocok. Anda telah mengacaukan pesanan, tetapi akan sangat mengurangi jumlah nilai yang Anda set vs yang Anda tinggalkan sendiri. Yang merupakan metode yang bagus untuk diketahui tetapi tidak akan banyak membantu di sini karena .set () pada dasarnya gratis, tetapi bentuk delete adalah alat yang berguna untuk sabuk Anda.
Meskipun ini tampaknya cukup masuk akal, .remove () pada iterator secara internal memanggil:
Yang lagi operasi O (n) dalam menghapus. Itu System.arraycopy () yang lagi-lagi bukan apa yang Anda inginkan, jika Anda peduli kecepatan. Ini membuatnya n ^ 2.
Ada juga:
Yaitu O (m * n ^ 2). Di sini kita tidak hanya mengulang daftar. Kami mengulangi seluruh daftar, setiap kali kami cocok dengan nol. Kemudian kami melakukan operasi n / 2 (rata-rata) untuk melakukan System.arraycopy () untuk melakukan penghapusan. Anda dapat benar-benar mengurutkan seluruh koleksi antara item dengan nilai dan item dengan nilai nol dan memotong akhir dalam waktu yang lebih singkat. Bahkan, itu berlaku untuk semua yang rusak. Setidaknya dalam teori, sistem yang sebenarnya. Arraycopy sebenarnya bukan operasi N dalam praktek. Secara teori, teori dan praktik adalah hal yang sama; dalam praktiknya tidak.
sumber
Ada cara mudah untuk menghapus semua
null
nilai daricollection
. Anda harus melewati koleksi yang berisi null sebagai parameter keremoveAll()
metodesumber
The
Objects
kelas memilikinonNull
Predicate
yang dapat digunakan denganfilter
.Sebagai contoh:
sumber
Menggunakan Java 8, Anda dapat melakukan ini menggunakan
stream()
danfilter()
atau
Untuk info lebih lanjut: Java 8 - Streaming
sumber
Ini adalah cara mudah untuk menghapus nilai null default dari daftar array
jika tidak, nilai string "null" hapus dari arraylist
sumber
Saya bermain-main dengan ini dan menemukan bahwa trimToSize () tampaknya berfungsi. Saya bekerja di platform Android jadi mungkin berbeda.
sumber
trimToSize
tidak mengubah konten aArrayList
. Jika ini berbeda di android, itu mungkin bug.Kita dapat menggunakan iterator untuk hal yang sama untuk menghapus semua nilai nol.
sumber
Saya menggunakan antarmuka aliran bersama-sama dengan operasi aliran mengumpulkan dan metode penolong untuk menghasilkan daftar baru.
sumber
tourists.stream().filter(s -> s != null).collect(Collectors.toList());
Terutama saya menggunakan ini:
Tetapi setelah saya mempelajari Java 8, saya beralih ke ini:
sumber
Menggunakan Java 8 ini dapat dilakukan dengan berbagai cara menggunakan aliran, aliran paralel dan
removeIf
metode:Aliran paralel akan menggunakan prosesor yang tersedia dan akan mempercepat proses untuk daftar berukuran wajar. Itu selalu disarankan untuk benchmark sebelum menggunakan stream.
sumber
Mirip dengan jawaban @Lithium tetapi tidak melempar kesalahan "Daftar mungkin tidak mengandung tipe null":
sumber
sumber