Saya punya ArrayList<String>
, dan saya ingin menghapus string berulang dari itu. Bagaimana saya bisa melakukan ini?
java
list
collections
arraylist
duplicates
pengguna25778
sumber
sumber
public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
List
danSet
(bukan tipe implementasiArrayList
danHashSet
seperti dalam contoh Anda).new HashSet(al)
alih-alih menginisialisasi untuk mengosongkan dan memanggiladdAll
.Object
memiliki beberapa nilai jika dua dari mereka mengulang saya menganggapnya sebagai duplikat (nilai-nilai lain dapat berbeda) dan digunakanSet
?Meskipun mengonversikan
ArrayList
ke yangHashSet
efektif menghapus duplikat, jika Anda perlu mempertahankan urutan penyisipan, saya lebih suka menyarankan Anda untuk menggunakan varian iniKemudian, jika Anda perlu mendapatkan kembali
List
referensi, Anda dapat menggunakan lagi konstruktor konversi.sumber
Di Jawa 8:
Harap perhatikan bahwa kontrak hashCode-equals untuk anggota daftar harus dihormati agar penyaringan berfungsi dengan baik.
sumber
addAll
untuknew TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
. Elemen pertama yang ditambahkan akan tetap di set jadi jika daftar Anda berisi "Dog" dan "dog" (dalam urutan itu)TreeSet
akan berisi "Dog". Jika pesanan harus dipertahankan maka sebelum baris dalam jawaban dimasukkanlist.replaceAll(String::toUpperCase);
.Misalkan kita memiliki daftar
String
seperti:Kemudian kita dapat menghapus elemen duplikat dengan berbagai cara.
Sebelum ke Jawa 8
Catatan: Jika kita ingin menjaga ketertiban penyisipan maka kita perlu untuk menggunakan
LinkedHashSet
di tempatHashSet
Menggunakan Jambu Biji
Menggunakan Java 8
Catatan: Jika kami ingin mengumpulkan hasilnya dalam implementasi daftar tertentu misalnya
LinkedList
maka kami dapat mengubah contoh di atas sebagai:Kita dapat menggunakan
parallelStream
juga dalam kode di atas tetapi mungkin tidak memberikan manfaat kinerja yang diharapkan. Lihat pertanyaan ini untuk lebih lanjut.sumber
parallel streams
akan selalu memberikan kinerja yang lebih baik. Tapi itu hanya mitos. Saya kemudian mengetahui bahwa ada beberapa skenario di mana aliran paralel harus digunakan. Dalam skenario ini, aliran paralel tidak akan memberikan kinerja yang lebih baik. dan ya aliran paralel mungkin tidak memberikan hasil yang diinginkan beberapa kasus.List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
harus menjadi solusi yang cocok dalam kasus iniJika Anda tidak ingin duplikat, gunakan Set daripada a
List
. Untuk mengonversi aList
menjadiSet
Anda dapat menggunakan kode berikut:Jika benar - benar diperlukan, Anda dapat menggunakan konstruksi yang sama untuk mengubah
Set
kembali menjadi aList
.sumber
Set
tidak bisa digunakan di sini.Anda juga dapat melakukannya dengan cara ini, dan menjaga ketertiban:
sumber
Java 8 stream menyediakan cara yang sangat sederhana untuk menghapus elemen duplikat dari daftar. Menggunakan metode yang berbeda. Jika kami memiliki daftar kota dan kami ingin menghapus duplikat dari daftar itu dapat dilakukan dalam satu baris -
Cara menghapus elemen duplikat dari daftar array
sumber
Berikut cara yang tidak memengaruhi pemesanan daftar Anda:
l1 adalah daftar asli, dan l2 adalah daftar tanpa item berulang (Pastikan YourClass memiliki metode yang sama dengan apa yang ingin Anda perjuangkan untuk kesetaraan)
sumber
ArrayList<T>
harus digunakan sebagai gantiArrayList
) 2) Pembuatan iterator eksplisit dapat dihindari dengan menggunakan afor (T current : l1) { ... }
. Bahkan jika Anda ingin menggunakan secaraIterator
eksplisit,iterador
salah eja.Dimungkinkan untuk menghapus duplikat dari arraylist tanpa menggunakan HashSet atau satu arraylist lagi .
Coba kode ini ..
Output adalah
sumber
ImmutableSet.copyOf(lst).toList()
.indexOf
iterasilst
menggunakan for for loop.Ada juga
ImmutableSet
dari Guava sebagai opsi (di sini adalah dokumentasi):sumber
ImmutableSet.asList()
metode, mengembalikanImmutableList
, jika Anda memerlukannya kembali sebagaiList
.ini bisa menyelesaikan masalah:
sumber
Mungkin agak berlebihan, tetapi saya menikmati masalah terisolasi semacam ini. :)
Kode ini menggunakan Set sementara (untuk pemeriksaan keunikan) tetapi menghapus elemen langsung di dalam daftar asli. Karena penghapusan elemen di dalam ArrayList dapat menyebabkan sejumlah besar penyalinan array, metode penghapusan (int) dihindari.
Sementara kami melakukannya, ini adalah versi untuk LinkedList (jauh lebih bagus!):
Gunakan antarmuka penanda untuk menyajikan solusi terpadu untuk Daftar:
EDIT: Saya kira barang generik tidak benar-benar menambah nilai apa pun di sini .. :)
sumber
sumber
Jika Anda ingin menggunakan perpustakaan pihak ketiga, Anda dapat menggunakan metode ini
distinct()
di Eclipse Collections (sebelumnya GS Collections).Keuntungan menggunakan
distinct()
alih-alih mengonversi ke Set dan kemudian kembali ke Daftar adalahdistinct()
mempertahankan urutan Daftar asli, mempertahankan kemunculan pertama setiap elemen. Diimplementasikan dengan menggunakan Set dan Daftar.Jika Anda tidak dapat mengonversi Daftar asli Anda menjadi jenis Koleksi Eclipse, Anda bisa menggunakan ListAdapter untuk mendapatkan API yang sama.
Catatan: Saya pengendara untuk Eclipse Collections.
sumber
Tiga baris kode ini dapat menghapus elemen yang digandakan dari ArrayList atau koleksi apa pun.
sumber
Saat Anda mengisi ArrayList, gunakan kondisi untuk setiap elemen. Sebagai contoh:
Kami akan mendapatkan array {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sumber
Jika Anda ingin mempertahankan Pesanan Anda, maka yang terbaik adalah menggunakan LinkedHashSet . Karena jika Anda ingin meneruskan Daftar ini ke Query Sisipkan dengan menghapusnya, urutannya akan dipertahankan.
Coba ini
Konversi ini akan sangat membantu ketika Anda ingin mengembalikan Daftar tetapi bukan Set.
sumber
Kode:
Catatan: Pasti, akan ada overhead memori.
sumber
sumber
LinkedHashSet akan melakukan triknya.
// output: 5,1,2,3,4
sumber
sumber
Ini digunakan untuk daftar Objek Kustom Anda
sumber
Anda dapat menggunakan nested loop di follow:
sumber
Seperti yang dikatakan sebelumnya, Anda harus menggunakan kelas yang mengimplementasikan antarmuka Set bukannya Daftar untuk memastikan keaslian elemen. Jika Anda harus menjaga urutan elemen, antarmuka SortedSet kemudian dapat digunakan; kelas TreeSet mengimplementasikan antarmuka itu.
sumber
Jika Anda menggunakan tipe model Daftar <T> / ArrayList <T>. Semoga ini bisa membantu Anda.
Ini kode saya tanpa menggunakan struktur data lain seperti set atau hashmap
sumber
sumber
sumber
sumber
sumber
Jika Anda ingin menghapus duplikat dari ArrayList berarti temukan logika di bawah ini,
sumber