Kruising tussen twee Integer Arrays

1. Overzicht

In deze korte tutorial bekijken we hoe bereken het snijpunt tussen twee Integer-arrays 'een' en ‘B '.

We zullen ons ook concentreren op het omgaan met dubbele vermeldingen.

Voor de implementatie gebruiken we Streams.

2. Lidmaatschapspredicaat voor een array

Het snijpunt van twee sets is per definitie een set met alle waarden van één, die ook deel uitmaken van de tweede set.

Daarom hebben we een Functie of liever een Predikaat om het lidmaatschap van de tweede array te bepalen. Sinds Lijst een dergelijke methode uit de doos biedt, zullen we dit omzetten in een Lijst:

Predikaat isContainedInB = Arrays.asList (b) :: bevat; 

3. Bouwen aan de kruising

Om de resulterende array op te bouwen, zullen we de elementen van de eerste set sequentieel beschouwen en controleren of ze ook in de tweede array voorkomen.Vervolgens maken we op basis hiervan een nieuwe array.

De Stroom API biedt ons de benodigde methoden. Eerst maken we een Stroomen filter vervolgens met de lidmaatschaps-Predikaat en tot slot maken we een nieuwe array:

openbaar statisch geheel getal [] intersectionSimple (geheel getal [] a, geheel getal [] b) {retour Stream.of (a) .filter (Arrays.asList (b) :: bevat) .toArray (geheel getal [] :: nieuw); }

4. Dubbele vermeldingen

Omdat arrays in Java geen Set implementatie, worden we geconfronteerd met het probleem van dubbele vermeldingen in de invoer en vervolgens in het resultaat. Merk op dat het aantal exemplaren in het resultaat afhangt van het aantal exemplaren in de eerste parameter.

Maar voor sets mogen elementen niet meerdere keren voorkomen. We kunnen dit archiveren met behulp van de onderscheiden () methode:

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

De lengte van de kruising is dus niet langer afhankelijk van de parametervolgorde.

Het snijpunt van een array met zichzelf is echter mogelijk niet meer de array, omdat we dubbele invoer verwijderen.

5. Multiset-kruising

Een meer algemeen begrip, dat meerdere gelijke invoer toestaat, zijn multisets. Voor hen wordt de kruising dan bepaald door het minimale aantal invoer-exemplaren. Dus ons lidmaatschap-Predikaat moet bijhouden hoe vaak we een element aan het resultaat toevoegen.

De verwijderen() methode kan hiervoor worden gebruikt, die het lidmaatschap retourneert en de elementen verbruikt. Dus tenslotte gelijke elementen in ‘B ' worden verbruikt, worden er geen gelijke elementen meer aan het resultaat toegevoegd:

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

Sinds de Arrays API retourneert alleen een onveranderlijk Lijst, we moeten een toegewijde veranderlijke genereren.

6. Conclusie

In dit artikel hebben we gezien hoe u de bevat en verwijderen methoden om een ​​kruising voor twee arrays in Java te implementeren.

Alle implementatie, codefragmenten en tests zijn te vinden in onze GitHub-repository - dit is een op Maven gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.