Presijecanje dvaju cjelovitih nizova

1. Pregled

U ovom ćemo brzom vodiču pogledati kako to učiniti izračunati presjek između dva polja Integer "A" i "B".

Također ćemo se usredotočiti na postupanje s dvostrukim unosima.

Za implementaciju ćemo upotrijebiti Potoci.

2. Predikat članstva za niz

Sjecište dvaju skupova po definiciji je skup sa svim vrijednostima iz jednog, koje su također dio drugog skupa.

Stoga nam treba a Funkcija ili bolje rečeno a Predikat da odluči o članstvu u drugom nizu. Od Popis pruža takvu metodu iz kutije, transformirat ćemo je u Popis:

Predikat jeContainInB = Arrays.asList (b) :: contains; 

3. Izgradnja raskrižja

Da bismo izgradili rezultirajući niz, razmotrit ćemo elemente prvog skupa uzastopno i provjeriti sadrže li ih i oni u drugom nizu.Tada ćemo stvoriti novi niz temeljen na ovome.

The Stream API nam pruža potrebne metode. Prvo ćemo stvoriti Stream, zatim filtrirajte s članstvom-Predikat i na kraju ćemo stvoriti novi niz:

javni statički Integer [] intersectionSimple (Integer [] a, Integer [] b) {return Stream.of (a) .filter (Arrays.asList (b) :: contains) .toArray (Integer [] :: new); }

4. Dvostruki unosi

Budući da su nizovi u Javi br Postavi implementacije, suočavamo se s problemom dvostrukih unosa u ulazu, a zatim u rezultatu. Primijetite da broj pojavljivanja u rezultatu ovisi o pojavljivanjima u prvom parametru.

Ali za skupove, elementi se ne smiju pojavljivati ​​više puta. To možemo arhivirati pomoću različit () metoda:

javni statički Integer [] intersectionSet (Integer [] a, Integer [] b) {return Stream.of (a) .filter (Arrays.asList (b) :: sadrže) .distinct () .toArray (Integer [] :: novi); }

Dakle, duljina sjecišta više ne ovisi o redoslijedu parametara.

Međutim, presjek niza sam sa sobom možda neće biti niz opet jer uklanjamo dvostruke unose.

5. Višesječno raskrižje

Općenitiji pojam, koji omogućuje višestruko jednake unose, jesu multisetovi. Za njih je presjek tada definiran minimalnim brojem ulaznih pojava. Dakle, naše članstvo-Predikat mora zadržati rezultat koliko često dodamo element rezultatu.

The ukloniti() Za to se može koristiti metoda koja vraća članstvo i troši elemente. Dakle, nakon svih jednakih elemenata u "B" konzumiraju se, rezultat se ne dodaje više jednaki elementi:

javni statički Integer [] intersectionSet (Integer [] a, Integer [] b) {return Stream.of (a) .filter (novi LinkedList (Arrays.asList (b)) :: remove) .toArray (Integer [] :: novi); } 

Budući da je Nizovi API vraća samo nepromjenjiv Popis, moramo generirati namjenski promjenjivi.

6. Zaključak

U ovom smo članku vidjeli kako se koristi sadrži i ukloniti metode za provedbu presjeka za dva niza u Javi.

Sva implementacija, isječci koda i testovi mogu se naći u našem spremištu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.