Skæringspunkt mellem to heltal arrays

1. Oversigt

I denne hurtige vejledning skal vi se på, hvordan man gør det beregne krydset mellem to heltal arrays 'en' og 'B'.

Vi vil også fokusere på, hvordan man håndterer dobbelte poster.

Til implementeringen bruger vi Strømme.

2. Medlemskab forudsiger en matrix

Skæringspunktet mellem to sæt er pr. Definition et sæt med alle værdier fra et, som også er en del af det andet sæt.

Derfor har vi brug for en Fungere eller rettere en Prædikat at beslutte medlemskab i den anden matrix. Siden Liste giver en sådan metode ud af kassen, transformerer vi denne til en Liste:

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

3. Opbygning af krydset

For at opbygge den resulterende matrix overvejer vi elementerne i det første sæt sekventielt og kontrollerer, om de også er indeholdt i det andet array.Derefter opretter vi et nyt array baseret på dette.

Det Strøm API giver os de nødvendige metoder. Først opretter vi en Strøm, filtrer derefter med medlemskab-Prædikat og endelig opretter vi et nyt array:

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

4. Dupliserede poster

Da arrays i Java er nr Sæt implementering står vi over for spørgsmålet om duplikater i input og derefter i resultatet. Bemærk, at antallet af forekomster i resultatet afhænger af forekomsterne i den første parameter.

Men for sæt må elementer ikke forekomme flere gange. Vi kan arkivere dette ved hjælp af tydelig () metode:

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

Så længden af ​​krydset afhænger ikke længere af parameterrækkefølgen.

Skæringspunktet mellem en matrix med sig selv er dog muligvis ikke arrayet igen, da vi fjerner dobbeltindgange.

5. Kryds i flere sæt

En mere generel forestilling, som tillader flere lige poster, er multisæt. For dem defineres krydset derefter af det minimale antal inputforekomster. Så vores medlemskab-Prædikat skal holde score, hvor ofte vi tilføjer et element til resultatet.

Det fjerne() metode kan bruges til dette, som returnerer medlemskabet og forbruger elementerne. Så trods alt lige elementer i 'B' forbruges, tilføjes ikke flere lige store elementer 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 den Arrays API returnerer kun en uforanderlig Liste, vi er nødt til at generere en dedikeret, muterbar.

6. Konklusion

I denne artikel har vi set, hvordan man bruger indeholder og fjerne metoder til at implementere et kryds for to arrays i Java.

Al implementering, kodestykker og test kan findes i vores GitHub-arkiv - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.


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