Saya memiliki Daftar tipe Integer misalnya:
[1, 1, 2, 3, 3, 3]
Saya ingin metode untuk mengembalikan semua duplikat misalnya:
[1, 3]
Apa cara terbaik untuk melakukannya?
java
collections
paling segar
sumber
sumber
Jawaban:
Metode
add
dariSet
hasil sebuah boolean apakah suatu nilai sudah ada (benar jika itu tidak ada, false jika sudah ada, lihat Set dokumentasi ).Jadi, lakukan iterasi melalui semua nilai:
sumber
for (Integer yourInt
, untuk menghindari tinju dan unboxing yang tidak perlu, terutama karena masukan Anda sudah berisiInteger
s.HashSet
Anda juga harus mempertimbangkan faktor beban, misalnya ketika Anda menentukan kapasitas awal100
, karena Anda ingin menambahkan jumlah elemen itu, itu akan dibulatkan ke pangkat berikutnya 2 (128
), yang berarti bahwa dengan faktor beban default0.75f
, ambang pengubahan ukuran akan menjadi96
, jadi akan ada pengubahan ukuran sebelum Anda menambahkan100
elemen. Untungnya, mengubah ukuran tidak semahal itu lagi. Dengan JRE terbaru, mengubah ukuran tidak mengulang lagi, elemen hanya didistribusikan di antara dua kemungkinan lokasi hasil berdasarkan bit yang relevan.Saya membutuhkan solusi untuk ini juga. Saya menggunakan solusi leifg dan membuatnya menjadi generik.
sumber
Saya mengambil solusi John Strickler dan membuatnya kembali untuk menggunakan API aliran yang diperkenalkan di JDK8:
sumber
distinct()
juga stateful. Tidak dapat memikirkan operasi berbeda yang efisien (O (n)) yang tidak stateful.Berikut adalah solusi menggunakan Streams dengan Java 8
Anda hanya perlu melihat apakah frekuensi objek ini lebih dari sekali dalam daftar Anda. Kemudian panggil .distinct () untuk hanya memiliki elemen unik dalam hasil Anda
sumber
Collections::frequency
adalah O (n). Itu perlu melalui seluruh koleksi untuk menemukan frekuensi suatu barang. Dan kami memanggil ini sekali untuk setiap item dalam koleksi, yang membuat cuplikan iniO(n^2)
. Anda akan melihat perbedaan dalam koleksi lebih dari segelintir elemen. Saya tidak pernah menggunakan ini dalam kode sebenarnya.solusi dasar java 8:
sumber
Jelas Anda dapat melakukan apa pun yang Anda inginkan dengan mereka (misalnya, meletakkan Set untuk mendapatkan daftar unik dari nilai duplikat) daripada mencetak ... Ini juga memiliki keuntungan merekam lokasi item duplikat juga.
sumber
Menggunakan Guava di Java 8
sumber
Ini juga berfungsi:
sumber
Anda dapat menggunakan sesuatu seperti ini:
sumber
int
sebagai tipe variabel di sini. Ini berarti bahwa untuk setiap iterasi, sebuah Integer tidak dikotakkan sekali dan int dikotak empat kali!Lambas mungkin bisa menjadi solusi
sumber
Gunakan MultiMap untuk menyimpan setiap nilai sebagai kumpulan kunci / nilai. Kemudian lakukan iterasi melalui kunci dan temukan kunci dengan beberapa nilai.
sumber
Jika Anda menggunakan Koleksi Eclipse , ini akan berfungsi:
Pembaruan: Pada Koleksi Eclipse 9.2 Anda sekarang dapat menggunakan
selectDuplicates
Anda juga dapat menggunakan koleksi primitif untuk melakukannya:
Catatan: Saya seorang pelaku untuk Koleksi Eclipse.
sumber
sumber
Mirip dengan beberapa jawaban di sini, tetapi jika Anda ingin menemukan duplikat berdasarkan beberapa properti:
sumber
buat
Map<Integer,Integer>
, ulangi daftar, jika elemen ada di peta, tingkatkan nilainya, jika tidak tambahkan ke peta dengan key = 1,ulangi peta, dan tambahkan ke daftar semua elemen dengan key> = 2
sumber
Versi ringkas yang dihasilkan dari jawaban teratas, juga menambahkan cek kosong dan ukuran Set yang dialokasikan sebelumnya:
sumber
tempSet
denganlistSize
bila perlu. Ini adalah pengoptimalan kecil tapi saya menyukainya.Saya mengambil jawaban Sebastian dan menambahkan keyExtractor padanya -
sumber
Alternatif aman utas adalah ini:
sumber
Coba ini untuk menemukan item duplikat dalam daftar:
sumber
Ini harus bekerja untuk disortir dan tidak disortir.
sumber
Ini adalah masalah di mana teknik fungsional bersinar. Sebagai contoh, solusi F # berikut lebih jelas dan tidak terlalu rentan terhadap bug dibandingkan solusi Java imperatif terbaik (dan saya bekerja setiap hari dengan Java dan F #).
Tentu saja pertanyaan ini tentang Java. Jadi saran saya adalah mengadopsi perpustakaan yang menghadirkan fitur fungsional ke Java. Misalnya, ini bisa diselesaikan menggunakan perpustakaan saya sendiri sebagai berikut (dan ada beberapa lainnya di luar sana yang layak untuk dilihat juga):
sumber
sumber
sumber
Ini akan menjadi metode yang baik untuk menemukan nilai Duplikat, tanpa menggunakan Set.
Dan katakanlah, Anda menginginkan metode yang mengembalikan Anda daftar berbeda, yaitu jika Anda meneruskan daftar di mana elemen muncul lebih dari sekali, Anda akan mendapatkan daftar dengan elemen berbeda.
sumber
Dan versi yang menggunakan
commons-collections
CollectionUtils.getCardinalityMap
metode:``
sumber
Bagaimana dengan kode ini -
sumber
untuk berjaga-jaga bagi mereka yang juga ingin menyertakan duplikat dan bukan duplikat. pada dasarnya jawaban tersebut mirip dengan jawaban yang benar tetapi bukannya kembali dari jika bukan bagian Anda mengembalikan bagian lain
gunakan kode ini (ubah ke jenis yang Anda butuhkan)
sumber
Metode yang lebih umum sebagai varian dari https://stackoverflow.com/a/52296246
sumber
Jika Anda mengetahui nilai maksimum (misalnya <10000), Anda dapat mengorbankan ruang untuk kecepatan. Saya tidak dapat mengingat nama pasti dari teknik ini.
kode semu:
sumber
Coba saja ini:
Contoh jika nilai List adalah: [1, 2, 3, 4, 5, 6, 4, 3, 7, 8] duplikat item [3, 4].
sumber