Apakah ada metode untuk melakukannya? Saya mencari tetapi tidak dapat menemukannya.
Pertanyaan lain: Saya perlu metode ini sehingga saya bisa memfilter file. Beberapa AND
filter dan beberapa OR
filter (seperti dalam teori himpunan), jadi saya perlu memfilter menurut semua file dan menyatukan / memotong ArrayLists yang menyimpan file-file tersebut.
Haruskah saya menggunakan struktur data yang berbeda untuk menyimpan file? Apakah ada hal lain yang akan menawarkan runtime yang lebih baik?
java
list
union
intersection
yotamoo
sumber
sumber
Vector
? Kelas itu telah putus asa sejak Java 1.2.Vector
adalah untuk interaksi lintas thread, tetapi ada struktur data yang lebih aman untuk kasus penggunaan tersebut juga. Lihat juga pertanyaan ini . Perpustakaan mana pun yang masih digunakanVector
pada 2016 sangat mencurigakan menurut saya.Jawaban:
Berikut ini implementasi sederhana tanpa menggunakan perpustakaan pihak ketiga. Keuntungan utama lebih
retainAll
,removeAll
danaddAll
bahwa metode ini tidak mengubah input daftar asli ke metode.sumber
HashSet
untukintersection
sehingga kinerja kasus rata-rata adalah O (n) bukan O (n ^ 2).Koleksi (jadi ArrayList juga) memiliki:
Gunakan implementasi Daftar jika Anda menerima pengulangan, Set implementasi jika Anda tidak:
sumber
HashSet
gantinya.addAll()
serikat untuk daftar; itu hanya menyatukan daftar kedua ke akhir yang pertama. Operasi gabungan akan menghindari penambahan elemen jika daftar pertama sudah mengandungnya.Posting ini cukup lama, tetapi tetap saja itu yang pertama muncul di google ketika mencari topik itu.
Saya ingin memberikan pembaruan menggunakan aliran Java 8 melakukan (pada dasarnya) hal yang sama dalam satu baris:
Jika ada yang memiliki solusi yang lebih baik / lebih cepat, beri tahu saya, tetapi solusi ini adalah liner bagus yang dapat dengan mudah dimasukkan dalam metode tanpa menambahkan kelas / metode pembantu yang tidak perlu dan tetap menjaga keterbacaannya.
sumber
Set
lalu gunakan metode setcontains
. Tidak semua hal dalam hidup harus dilakukan dengan aliran.serikat akan menjadi
removeAll
dan kemudianaddAll
.Temukan lebih banyak di dokumentasi koleksi (ArrayList adalah koleksi) http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html
sumber
retainAll()
danremoveAll()
merupakan operasi O (n ^ 2) pada daftar. Kita bisa melakukan yang lebih baik.retainAll
dari {1, 2, 2, 3, 4, 5} lebih dari {1, 2, 3} menghasilkan {1, 2, 2, 3}. Bukankah seharusnya {1, 2, 3} menjadi persimpangan?Serikat pekerja dan persimpangan hanya ditentukan untuk set, bukan daftar. Seperti yang Anda sebutkan.
Periksa perpustakaan jambu biji untuk filter. Juga jambu memberikan persimpangan dan persatuan yang nyata
sumber
Anda dapat menggunakan
CollectionUtils
dari apache commons .sumber
Solusi yang ditandai tidak efisien. Ini memiliki kompleksitas waktu O (n ^ 2). Apa yang bisa kita lakukan adalah mengurutkan kedua daftar, dan mengeksekusi algoritma persimpangan seperti yang di bawah ini.
Yang ini memiliki kompleksitas O (n log n + n) yang ada di O (n log n). Serikat pekerja dilakukan dengan cara yang sama. Pastikan Anda membuat modifikasi yang sesuai pada pernyataan if-elseif-else.
Anda juga dapat menggunakan iterator jika Anda mau (saya tahu mereka lebih efisien dalam C ++, saya tidak tahu apakah ini benar di Jawa juga).
sumber
contains()
dalam satu lingkaran (seperti saran Devenv) akan membutuhkan waktu O (n + m). Penyortiran tidak perlu rumit dan membutuhkan waktu O (n log n + m log n + n). Memang itu mengurangi waktu O (n log n), tapi itu masih lebih buruk daripada waktu linier, dan jauh lebih kompleks.Saya pikir Anda harus menggunakan
Set
untuk menyimpan file jika Anda ingin melakukan persimpangan dan menyatukannya. Kemudian Anda dapat menggunakan Jambu 's Set kelas untuk melakukanunion
,intersection
dan penyaringan olehPredicate
juga. Perbedaan antara metode ini dan saran lainnya adalah bahwa semua metode ini membuat pandangan malas tentang persatuan, persimpangan, dll. Dari dua set. Apache Commons membuat koleksi baru dan menyalin data ke sana.retainAll
mengubah salah satu koleksi Anda dengan menghapus elemen dari itu.sumber
Berikut ini cara Anda bisa melakukan persimpangan dengan stream (ingat bahwa Anda harus menggunakan java 8 untuk stream):
Contoh untuk daftar dengan tipe yang berbeda. Jika Anda memiliki realtion antara foo dan bar dan Anda bisa mendapatkan bar-objek dari foo daripada Anda dapat memodifikasi aliran Anda:
sumber
Saya menemukan ListUtils sangat berguna untuk kasus penggunaan ini.
Gunakan ListUtils dari org.apache.commons.collections jika Anda tidak ingin mengubah daftar yang ada.
ListUtils.intersection(list1, list2)
sumber
Anda dapat menggunakan commons-collections4 CollectionUtils
sumber
Di Java 8, saya menggunakan metode pembantu sederhana seperti ini:
sumber
Jika objek dalam daftar hashable (yaitu memiliki kode hash yang layak dan fungsi yang sama), pendekatan tercepat antara tabel kira-kira. size> 20 adalah untuk membangun HashSet untuk yang lebih besar dari dua daftar.
sumber
Saya juga sedang mengerjakan situasi yang sama dan sampai di sini mencari bantuan. Akhirnya menemukan solusi saya sendiri untuk Array. ArrayList AbsentDates = ArrayList baru (); // Akan Menyimpan Array1-Array2
Catatan: Posting ini jika dapat membantu seseorang menjangkau halaman ini untuk mendapatkan bantuan.
sumber
Persimpangan dua daftar objek yang berbeda berdasarkan kunci umum - Java 8
sumber
JDK8 + (Mungkin Kinerja Terbaik)
Jika Anda tidak peduli dengan kinerja dan lebih suka kode yang lebih kecil, gunakan saja:
sumber
Solusi akhir:
sumber
Pertama, saya menyalin semua nilai array ke dalam satu array lalu saya menghapus nilai duplikat ke dalam array. Baris 12, menjelaskan jika nomor yang sama terjadi lebih dari waktu kemudian masukkan nilai sampah tambahan ke posisi "j". Pada akhirnya, lintasi dari awal-akhir dan periksa apakah nilai sampah yang sama terjadi kemudian buang.
sumber
ArrayList
, untuk menyimpan hasil serikat.Integer
daripadaint
. Maka Anda dapat menggunakannull
sebagai ganti "nilai sampah" Anda. "Nilai sampah" atau "nilai sentinel" biasanya merupakan ide yang buruk, karena nilai-nilai ini mungkin masih terjadi pada input.Setelah pengujian, inilah pendekatan persimpangan terbaik saya.
Kecepatan lebih cepat dibandingkan dengan Pendekatan HashSet murni. HashSet dan HashMap di bawah ini memiliki kinerja yang mirip untuk array dengan lebih dari 1 juta catatan.
Adapun pendekatan Java 8 Stream, kecepatan sangat lambat untuk ukuran array lebih besar dari 10k.
Semoga ini bisa membantu.
sumber
retainAll () metode yang digunakan untuk menemukan elemen umum..ya; intersection list1.retainAll (list2)
sumber
Jika Anda memiliki data di Sets, Anda bisa menggunakan
Sets
kelas Guava .sumber
Jika nomor cocok dengan saya memeriksa itu terjadi pertama kali atau tidak dengan bantuan "indexOf ()" jika nomor cocok pertama kali kemudian cetak dan simpan ke dalam string jadi, bahwa ketika waktu berikutnya nomor yang sama cocok maka itu akan dimenangkan ' t mencetak karena karena kondisi "indexOf ()" akan salah.
}
sumber