Skjæringspunkt mellom to heltallarrays

1. Oversikt

I denne raske opplæringen vil vi se på hvordan du gjør det beregne skjæringspunktet mellom to heltal arrays 'en' og ‘B’.

Vi vil også fokusere på hvordan du skal håndtere dupliserte oppføringer.

For implementeringen bruker vi Strømmer.

2. Medlemskap Predikat for en matrise

Skjæringspunktet mellom to sett er per definisjon et sett med alle verdier fra ett, som også er en del av det andre settet.

Derfor trenger vi en Funksjon eller rettere sagt en Predikere å bestemme medlemskapet i den andre matrisen. Siden Liste gir en slik metode ut av boksen, vil vi forvandle denne til en Liste:

Predikat isContainedInB = Arrays.asList (b) :: inneholder; 

3. Bygg krysset

For å bygge opp den resulterende matrisen, vil vi vurdere elementene i det første settet sekvensielt og kontrollere om de også finnes i den andre matrisen.Så lager vi en ny matrise basert på dette.

De Strøm API gir oss de nødvendige metodene. Først oppretter vi en Strøm, filtrer deretter med medlemskap-Predikere og til slutt oppretter vi en ny matrise:

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

4. Dupliserte oppføringer

Siden matriser i Java er nei Sett implementering, står vi overfor spørsmålet om dupliserte oppføringer i inngangen og deretter i resultatet. Legg merke til at antall forekomster i resultatet avhenger av forekomstene i den første parameteren.

Men for sett må elementer ikke forekomme flere ganger. Vi kan arkivere dette ved å bruke distinkt() metode:

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

Så lengden på krysset avhenger ikke lenger av parameterrekkefølgen.

Skjæringspunktet til en matrise med seg selv er kanskje ikke matrisen igjen siden vi fjerner doble oppføringer.

5. Flersettkryss

En mer generell forestilling, som tillater flere like oppføringer, er multisett. For dem blir krysset da definert av det minimale antall inngangshendelser. Så vårt medlemskap-Predikere må holde poengsum hvor ofte vi legger til et element i resultatet.

De fjerne() metode kan brukes til dette, som returnerer medlemskapet og forbruker elementene. Så tross alt like elementer i ‘B’ forbrukes, blir ikke flere like elementer lagt til resultatet:

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

Siden Arrays API returnerer bare en uforanderlig Liste, Vi må generere en dedikert muterbar.

6. Konklusjon

I denne artikkelen har vi sett hvordan du bruker inneholder og fjerne metoder for å implementere et kryss for to matriser i Java.

All implementering, kodebiter og tester finner du i GitHub-depotet vårt - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found