Persimpangan Antara dua Susunan Integer

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat bagaimana menghitung persimpangan antara dua tatasusila Integer 'a' dan 'b' .

Kami juga akan menumpukan pada bagaimana menangani entri pendua.

Untuk pelaksanaannya, kami akan menggunakan Aliran.

2. Predikat Keahlian untuk Array

Persimpangan dua set adalah dengan definisi satu set dengan semua nilai dari satu, yang juga merupakan bahagian dari set kedua.

Oleh itu, kita memerlukan Fungsi atau lebih tepatnya Predicate untuk memutuskan keahlian dalam array kedua. Oleh kerana List menyediakan kaedah seperti itu di luar kotak, kami akan mengubahnya menjadi List :

Predicate isContainedInB = Arrays.asList(b)::contains; 

3. Membina Persimpangan

Untuk membina susunan yang dihasilkan, kami akan mempertimbangkan unsur-unsur dari set pertama secara berurutan dan mengesahkan apakah itu juga terkandung dalam array kedua.Kemudian kami akan membuat susunan baru berdasarkan ini.

The Stream API memberikan kita kaedah yang diperlukan. Pertama, kami akan membuat Aliran , kemudian menapis dengan keahlian- Predikat dan akhirnya kami akan membuat susunan baru:

public static Integer[] intersectionSimple(Integer[] a, Integer[] b){ return Stream.of(a) .filter(Arrays.asList(b)::contains) .toArray(Integer[]::new); }

4. Pendua Pendua

Oleh kerana array di Java tidak ada implementasi Set , kita menghadapi masalah entri pendua di input dan kemudian hasilnya. Perhatikan bahawa jumlah kejadian dalam hasilnya bergantung pada kejadian pada parameter pertama.

Tetapi untuk set, elemen tidak boleh berlaku berkali-kali. Kami dapat mengarkibkan ini dengan menggunakan kaedah yang berbeza () :

public static Integer[] intersectionSet(Integer[] a, Integer[] b){ return Stream.of(a) .filter(Arrays.asList(b)::contain) .distinct() .toArray(Integer[]::new); }

Jadi panjang persimpangan tidak lagi bergantung pada susunan parameter.

Walau bagaimanapun, persimpangan array dengan sendirinya mungkin bukan susunan lagi kerana kami membuang entri berganda.

5. Persimpangan Multiset

Pengertian yang lebih umum, yang membolehkan banyak entri sama, adalah pelbagai set. Bagi mereka, persimpangan kemudian ditakrifkan oleh jumlah kejadian input minimum. Jadi keahlian kami - Predikat mesti memastikan berapa kerap kita menambah elemen pada hasilnya.

Kaedah remove () boleh digunakan untuk ini, yang mengembalikan keahlian dan menghabiskan elemen. Oleh itu, setelah semua unsur yang sama dalam 'b' habis, tidak ada unsur yang sama yang ditambahkan pada hasilnya:

public static Integer[] intersectionSet(Integer[] a, Integer[] b){ return Stream.of(a) .filter(new LinkedList(Arrays.asList(b))::remove) .toArray(Integer[]::new); } 

Oleh kerana API Array hanya mengembalikan Senarai yang tidak berubah , kita harus menghasilkan satu senarai yang boleh berubah.

6. Kesimpulannya

Dalam artikel ini, kami telah melihat bagaimana menggunakan kaedah berisi dan membuang untuk melaksanakan persimpangan untuk dua tatasusunan di Java.

Semua pelaksanaan, potongan kode, dan ujian boleh didapati di repositori GitHub kami - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.