Persimpangan Dua Daftar di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan belajar bagaimana mendapatkan persimpangan dua List s.

Seperti banyak perkara lain, ini menjadi lebih mudah berkat pengenalan aliran di Java 8.

2. Persimpangan Dua Senarai Rentetan

Mari buat dua Senarai sebanyak String s dengan beberapa persimpangan - kedua-duanya mempunyai beberapa elemen ditiru:

List list = Arrays.asList("red", "blue", "blue", "green", "red"); List otherList = Arrays.asList("red", "green", "green", "yellow");

Dan sekarang kita akan menentukan persimpangan senarai dengan bantuan kaedah aliran :

Set result = list.stream() .distinct() .filter(otherList::contains) .collect(Collectors.toSet()); Set commonElements = new HashSet(Arrays.asList("red", "green")); Assert.assertEquals(commonElements, result);

Pertama, kami membuang unsur pendua dengan perbezaan . Kemudian, kami menggunakan penapis untuk memilih elemen yang juga terkandung dalam Daftar lain .

Akhirnya, kami menukar output kami dengan Pemungut . Persimpangan harus mengandungi setiap elemen umum hanya sekali. Pesanan tidak seharusnya menjadi masalah, jadi toSet adalah pilihan paling mudah, tetapi kita juga boleh menggunakan kaedah toList atau pengumpul lain.

Untuk maklumat lebih lanjut, tinjau panduan kami untuk Java 8's Collectors.

3. Persimpangan Senarai Kelas Custom

Bagaimana jika Senarai kami tidak mengandungi String , melainkan contoh kelas khusus yang telah kami buat? Sepanjang kita mengikuti konvensi Java, penyelesaian dengan kaedah aliran akan berfungsi dengan baik untuk kelas khusus kita.

Bagaimana kaedah berisi memutuskan apakah objek tertentu muncul dalam senarai? Berdasarkan kaedah sama . Oleh itu, kita harus mengatasi kaedah sama dan memastikan bahawa ia membandingkan dua objek berdasarkan nilai sifat yang relevan.

Contohnya, dua segi empat sama jika lebar dan ketinggiannya sama.

Sekiranya kita tidak mengatasi kaedah sama , kelas kita menggunakan pelaksanaan sama dengan kelas induk. Pada penghujung hari, atau lebih tepatnya, rantai pewarisan, kaedah sama dengan Objek kelas dijalankan. Kemudian dua keadaan sama hanya jika merujuk pada objek yang sama di timbunan.

Untuk maklumat lebih lanjut mengenai kaedah sama , lihat artikel kami mengenai Java sama dengan () dan kontrak hashCode () .

4. Kesimpulan

Dalam artikel ringkas ini, kami telah melihat bagaimana menggunakan aliran untuk mengira persimpangan dua senarai. Terdapat banyak operasi lain yang agak membosankan tetapi cukup mudah jika kita mengetahui cara kita menggunakan Java Stream API. Lihat tutorial lanjut kami dengan aliran Java di sini.

Contoh kod boleh didapati di GitHub.