Bagaimana saya bisa mendeteksi (mengembalikan true / false) apakah ArrayList berisi lebih dari satu elemen yang sama di Java?
Terima kasih banyak, Terry
Sunting Lupa menyebutkan bahwa saya tidak ingin membandingkan "Blok" satu sama lain, tetapi nilai integernya. Setiap "blok" memiliki int dan inilah yang membuatnya berbeda. Saya menemukan int dari Blok tertentu dengan memanggil metode bernama "getNum" (misalnya table1 [0] [2] .getNum ();
Jawaban:
Paling sederhana: buang seluruh koleksi ke dalam Set (menggunakan konstruktor Set (Collection) atau Set.addAll), lalu lihat apakah Set memiliki ukuran yang sama dengan ArrayList.
Pembaruan: Jika saya memahami pertanyaan Anda dengan benar, Anda memiliki array Blok 2d, seperti pada
Blokir tabel [] [];
dan Anda ingin mendeteksi apakah ada baris yang memiliki duplikat?
Dalam hal ini, saya dapat melakukan hal berikut, dengan asumsi bahwa Block mengimplementasikan "sama dengan" dan "hashCode" dengan benar:
Saya tidak 100% yakin tentang sintaks, jadi mungkin lebih aman untuk menuliskannya sebagai
Set.add
mengembalikan boolean false jika item yang ditambahkan sudah ada di set, sehingga Anda bahkan dapat melakukan short circuit dan bale pada add yang mengembalikanfalse
jika semua yang ingin Anda ketahui adalah apakah ada duplikat.sumber
Kode yang ditingkatkan, menggunakan nilai kembalian
Set#add
daripada membandingkan ukuran daftar dan set.sumber
Set<T> set = new HashSet<T>(list.size());
? Dengan adanya parameter List, menurut saya akan lebih efisien jika biasanya list tidak mengandung duplikat.HashSet
ke ukuran daftar akan mengakibatkan pengubahan ukuran saat menjalankan seluruh daftar karena faktor pemuatan yang mendasari struktur hash.Jika Anda ingin menghindari duplikat sama sekali, Anda harus memotong proses tengah pendeteksian duplikat dan menggunakan Set .
sumber
Kode yang ditingkatkan untuk mengembalikan elemen duplikat
sumber
Jika elemen Anda entah bagaimana Dapat Dibandingkan (fakta bahwa urutan memiliki arti sebenarnya adalah acuh tak acuh - itu hanya perlu konsisten dengan definisi persamaan Anda), solusi penghapusan duplikat tercepat adalah mengurutkan daftar (0 (n log ( n))) kemudian melakukan single pass dan mencari elemen berulang (yaitu, elemen sama yang mengikuti satu sama lain) (ini adalah O (n)).
Kompleksitas keseluruhan akan menjadi O (n log (n)), yang kira-kira sama dengan apa yang akan Anda dapatkan dengan Himpunan (n kali panjang (n)), tetapi dengan konstanta yang jauh lebih kecil. Ini karena konstanta dalam pengurutan / dedup dihasilkan dari biaya elemen pembanding, sedangkan biaya dari kumpulan kemungkinan besar dihasilkan dari komputasi hash, ditambah satu (mungkin beberapa) perbandingan hash. Jika Anda menggunakan implementasi Set berbasis hash, itu karena berbasis Tree akan memberi Anda O (n log² (n)), yang bahkan lebih buruk.
Namun, seperti yang saya pahami, Anda tidak perlu menghapus duplikat, tetapi hanya menguji keberadaannya. Jadi, Anda harus membuat kode sendiri untuk algoritme gabungan atau penyortiran heap pada larik Anda, yang hanya keluar dengan mengembalikan true (yaitu "ada dup") jika pembanding Anda mengembalikan 0, dan sebaliknya menyelesaikan pengurutan, dan melintasi pengujian larik yang diurutkan untuk pengulangan . Dalam penggabungan atau penyortiran heap, memang, saat pengurutan selesai, Anda akan membandingkan setiap pasangan duplikat kecuali jika kedua elemen sudah berada di posisi akhirnya (yang tidak mungkin). Dengan demikian, algoritme pengurutan yang diubah harus menghasilkan peningkatan kinerja yang besar (saya harus membuktikannya, tetapi saya kira algoritme yang diubah harus ada di O (log (n)) pada data acak yang seragam)
sumber
Saya perlu melakukan operasi serupa untuk a
Stream
, tetapi tidak dapat menemukan contoh yang baik. Inilah yang saya dapatkan.Ini memiliki keuntungan dari hubungan arus pendek ketika duplikat ditemukan lebih awal daripada harus memproses seluruh aliran dan tidak jauh lebih rumit daripada hanya memasukkan semuanya ke dalam
Set
dan memeriksa ukurannya. Jadi kasus ini kira-kira menjadi:sumber
Dengan Java 8+ Anda dapat menggunakan Stream API:
sumber
Sederhananya: 1) pastikan semua item sebanding 2) urutkan array 2) ulangi array dan temukan duplikat
sumber
Untuk mengetahui Duplikat dalam Daftar gunakan kode berikut: Ini akan memberi Anda himpunan yang berisi duplikat.
sumber
cara terbaik untuk menangani masalah ini adalah dengan menggunakan HashSet :
Cukup cetak daftar larik hasil dan lihat hasilnya tanpa duplikat :)
sumber
Jika Anda menginginkan kumpulan nilai duplikat:
Dan mungkin juga berpikir tentang memangkas nilai atau menggunakan huruf kecil ... tergantung pada kasus Anda.
sumber
Catatan: ini akan memiliki kinerja yang besar meskipun item dihapus dari awal daftar. Untuk mengatasi ini, kami memiliki dua opsi. 1) ulangi dalam urutan terbalik dan hapus elemen. 2) Gunakan LinkedList, bukan ArrayList. Karena pertanyaan bias yang diajukan dalam wawancara untuk menghapus duplikat dari Daftar tanpa menggunakan koleksi lain, contoh di atas adalah jawabannya. Namun di dunia nyata, jika saya harus mencapai ini, saya akan meletakkan elemen dari List ke Set, sederhana!
sumber
Contoh kelas beton yang telah diganti
equals()
:sumber
sumber
Jawaban ini ditulis di Kotlin, tetapi dapat dengan mudah diterjemahkan ke Java.
Jika ukuran daftar larik Anda berada dalam kisaran kecil yang tetap, maka ini adalah solusi yang bagus.
sumber
sumber