Jadi jika saya memiliki dua set:
Set<Integer> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);
Set<Integer> test2 = new HashSet<Integer>();
test2.add(1);
test2.add(2);
test2.add(3);
test2.add(4);
test2.add(5);
Apakah ada cara untuk membandingkan mereka dan hanya memiliki set 4 dan 5 yang dikembalikan?
test1
ada6
, apakah jawabannya 4,5,6? yaitu Anda ingin perbedaan simetris en.wikipedia.org/wiki/Symmetric_differenceJawaban:
Coba ini
Setel # removeAll
sumber
Set
ketika tidak didefinisikanunion
,intersection
ataudifference
!!!test1.removeAll(test2);
mengembalikan hasil yang samatest2.removeAll(test1);
?test1.removeAll(test2)
adalah set kosong.test2.removeAll(test1)
adalah{4, 5}
.Jika Anda menggunakan perpustakaan Guava (sebelumnya Google Collections) ada solusinya:
Yang dikembalikan
SetView
adalahSet
, itu adalah representasi langsung yang bisa Anda buat tidak berubah atau menyalin ke set lain.test1
dantest2
dibiarkan utuh.sumber
symmetricDifference()
akan membawa semua kecuali persimpangan, bukan itu pertanyaan aslinya.Iya:
Meskipun ini akan bermutasi
test2
, jadi buat salinan jika Anda perlu melestarikannya.Juga, Anda mungkin bermaksud
<Integer>
bukannya<int>
.sumber
Java 8
Kita dapat menggunakan removeIf yang memerlukan predikat untuk menulis metode utilitas sebagai:
Dan jika kita masih di beberapa versi sebelumnya maka kita dapat menggunakan removeAll sebagai:
sumber
Jika Anda menggunakan Java 8, Anda dapat mencoba sesuatu seperti ini:
sumber
Set
yang lebih besar ... Oleh karena itu, jika Anda mencoba mengurangi aa yang lebih kecilSet
dari yang lebih besarSet
, Anda akan menerima hasil yang berbeda.public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {
sebagai tanda tangan, metode ini kemudian dapat digunakan sebagai fungsi utilitas umum.Comparator<T>
untuk dapat menyesuaikan perbandingan karenaequals
tidak selalu cukup.Anda dapat menggunakan
CollectionUtils.disjunction
untuk mendapatkan semua perbedaan atauCollectionUtils.subtract
untuk mendapatkan perbedaan dalam koleksi pertama.Berikut ini contoh cara melakukannya:
sumber
CollectionUtils
berasal? Apakah saya harus berasumsi bahwa itu dari Apache Commons Collection?Hanya dengan memberikan satu contoh di sini (sistem dalam
existingState
, dan kami ingin menemukan elemen untuk dihapus (elemen yang tidak adanewState
tetapi adaexistingState
) dan elemen untuk ditambahkan (elemen yang adanewState
tetapi tidak adaexistingState
):akan menampilkan ini sebagai hasilnya:
sumber