Saya memiliki dua ArrayList
objek dengan masing-masing tiga bilangan bulat. Saya ingin menemukan cara untuk mengembalikan elemen umum dari dua daftar. Adakah yang punya ide bagaimana saya bisa mencapai ini?
95
Gunakan Collection#retainAll()
.
listA.retainAll(listB);
// listA now contains only the elements which are also contained in listB.
Jika Anda ingin menghindari perubahan yang terpengaruh listA
, Anda perlu membuat yang baru.
List<Integer> common = new ArrayList<Integer>(listA);
common.retainAll(listB);
// common now contains only the elements which are contained in listA and listB.
Collection#retainAll()
dan komentar di cuplikan kode, tidak, tidak. Perubahan tercermin dalam daftar tempat Anda memanggil metode ini.Anda dapat menggunakan operasi persimpangan set dengan
ArrayList
objek Anda .Sesuatu seperti ini:
Sekarang,
l3
seharusnya hanya memiliki elemen yang sama antaral1
danl2
.sumber
l2
. Anda mungkin bermaksud mengatakannyaList<Integer> l3 = new ArrayList<Integer>(l2);
.Mengapa menemukan kembali roda? Gunakan Koleksi Commons :
sumber
retainAll()
pada elemen berulang. Jadi kemungkinan besar salah satu benar dan satu tidak benar tergantung pada bagaimana Anda mendekati masalah.Menggunakan
Stream.filter()
metode Java 8 yang dikombinasikan denganList.contains()
:sumber
sumber
Keluaran [1, 5]
sumber
Anda bisa mendapatkan elemen umum di antara dua daftar menggunakan metode "retretAll". Metode ini akan menghapus semua elemen yang tidak cocok dari daftar yang menerapkannya.
Dalam hal ini dari daftar, semua elemen yang tidak ada dalam list1 akan dihapus dan hanya yang tersisa yang umum antara list dan list1.
Keluaran:
CATATAN: Setelah mempertahankan Semua diterapkan pada daftar, daftar berisi elemen umum antara daftar dan list1.
sumber
sumber
sumber
pertimbangkan dua daftar L1 dan L2
Dengan menggunakan Java8 kita dapat dengan mudah menemukannya
L1.stream().filter(L2::contains).collect(Collectors.toList())
sumber
Jika Anda ingin melakukannya sendiri ..
sumber
commons
berisi elemen umum. Loop-kedua mencetaknya di konsol. Saya tidak melihat di mana kode menghitung elemen umum.Beberapa jawaban di atas mirip tapi tidak sama jadi posting sebagai jawaban baru.
Solusi:
1. Gunakan HashSet untuk menahan elemen yang perlu dihapus
2. Tambahkan semua elemen list1 ke HashSet
3. iterasi list2 dan hapus elemen dari HashSet yang ada di list2 ==> yang ada di list1 dan list2
4 Sekarang lakukan iterasi pada HashSet dan hapus elemen dari list1 (karena kita telah menambahkan semua elemen list1 untuk disetel), akhirnya, list1 memiliki semua elemen umum
Catatan: Kita dapat menambahkan semua elemen list2 dan dalam iterasi ke-3, kita harus menghapus elemen dari list2.
Kompleksitas waktu: O (n)
Kompleksitas Ruang: O (n)
Kode:
keluaran:
sumber