Schnittpunkt zwischen zwei Integer-Arrays

1. Übersicht

In diesem kurzen Tutorial sehen wir uns an, wie der Schnittpunkt zwischen zwei Integer-Arrays 'a' und 'b' berechnet wird .

Wir werden uns auch darauf konzentrieren, wie doppelte Einträge behandelt werden.

Für die Implementierung verwenden wir Streams.

2. Mitgliedschaftsprädikat für ein Array

Der Schnittpunkt zweier Mengen ist per Definition eine Menge mit allen Werten von einer, die ebenfalls Teil der zweiten Menge sind.

Daher benötigen wir eine Funktion oder vielmehr ein Prädikat , um die Mitgliedschaft im zweiten Array zu bestimmen. Da List eine solche Methode sofort bereitstellt, werden wir sie in eine Liste umwandeln :

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

3. Aufbau der Kreuzung

Um das resultierende Array aufzubauen, betrachten wir die Elemente des ersten Satzes nacheinander und überprüfen, ob sie auch im zweiten Array enthalten sind.Dann erstellen wir darauf basierend ein neues Array.

Die Stream- API bietet uns die erforderlichen Methoden. Zunächst werden wir einen schaffen Strom , dann Filter mit dem Mitglieds- Prädikat und schließlich werden wir ein neues Array erstellen:

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

4. Doppelte Einträge

Da Arrays in Java keine Set- Implementierung sind, treten doppelte Einträge in der Eingabe und dann im Ergebnis auf. Beachten Sie, dass die Anzahl der Vorkommen im Ergebnis von den Vorkommen im ersten Parameter abhängt.

Bei Mengen dürfen Elemente jedoch nicht mehrmals vorkommen. Wir können dies mit der Methode different () archivieren :

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

Die Länge der Kreuzung hängt also nicht mehr von der Parameterreihenfolge ab.

Der Schnittpunkt eines Arrays mit sich selbst ist jedoch möglicherweise nicht wieder das Array, da wir doppelte Einträge entfernen.

5. Multiset-Kreuzung

Ein allgemeinerer Begriff, der mehrere gleiche Einträge erlaubt, sind Multisets. Für sie wird der Schnittpunkt dann durch die minimale Anzahl von Eingabevorkommen definiert. Also unser Mitglieds- Prädikat muss Punktzahl halten , wie oft fügen wir ein Element zum Ergebnis.

Die remove () Methode kann dazu verwendet werden, die die Mitgliedschaft zurück und verbraucht die Elemente. Nachdem alle gleichen Elemente in 'b' verbraucht sind, werden dem Ergebnis keine gleichen Elemente mehr hinzugefügt:

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

Da die Arrays- API nur eine unveränderliche Liste zurückgibt , müssen wir eine dedizierte veränderbare Liste generieren.

6. Fazit

In diesem Artikel haben wir gesehen , wie die verwenden enthalten und entfernen Methoden eine Kreuzung für zwei Arrays in Java zu implementieren.

Alle Implementierungen, Codefragmente und Tests finden Sie in unserem GitHub-Repository. Dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.