ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen

Hallo,
ich habe folgendes Problem: ich habe eine ArrayList list in der sich eine unbekannte Anzahl an long[] Arrays befindet. Ich möchte nun die long Arrays mit einander vergleichen, also angenommen es sind drei Arrays drinnen:
1 [ 2, 2, 5, 7, 11]; 2 [2, 2, 2, 5, 13]; 3 [2, 2, 2, 2, 5]
Dann soll die Ausgabe 2, 2, 5 sein, da in allen Arrays die Zahl 2 zwei mal vorkommt und die Zahl 5 einmal.
Ich habe leider überhaupt keine Ahnung wie man das anstellen könnte.
 
Effektiv beschreibst du hier ja die "Schnittmenge"/Intersection (mit Duplikaten) über mehrere Arrays.
Hierfür kannst du einfach iterativ über jedes der einzelnen Arrays gehen und prüfen, ob jedes Element darin in deiner bisher ermittelten Schnittmenge enthalten ist. Daraus baust du dir / berechnest du dir eine neue Schnittmenge.
Diese "neue" Schnittmenge verwendest du dann wieder als Input für das nächste Array in der Liste, bis du am Ende eine Ergebnisschnittmenge hast.
Deine initiale Schnittmenge ist das erste Array in der Liste. Hierfür muss die Liste also mindestens ein Array enthalten, ansonsten macht das keinen Sinn.
 
Effektiv beschreibst du hier ja die "Schnittmenge"/Intersection (mit Duplikaten) über mehrere Arrays.
Hierfür kannst du einfach iterativ über jedes der einzelnen Arrays gehen und prüfen, ob jedes Element darin in deiner bisher ermittelten Schnittmenge enthalten ist. Daraus baust du dir / berechnest du dir eine neue Schnittmenge.
Diese "neue" Schnittmenge verwendest du dann wieder als Input für das nächste Array in der Liste, bis du am Ende eine Ergebnisschnittmenge hast.
Deine initiale Schnittmenge ist das erste Array in der Liste. Hierfür muss die Liste auch mindestens ein Array enthalten, ansonsten macht das keinen Sinn.
Achso, das ist ja einfacher als ich dachte. Danke!
 
Ja, das kann man auch tatsächlich sehr elegant in 2 Zeilen implementieren (mit etwas Streams-Magie).
Effektiv ist es eine Reduktion/reduction/reduce mit einem binären Operator auf zwei long[] Arrays.
 
Naja, die Reduktions-Operation ist in diesem Fall nicht die binäre Addition auf Zahlen, sondern die Berechnung der Schnittmenge auf zwei Arrays.
Du brauchst als elementare Operation einfach nur eine Methode, die zwei long[] Arrays als Input bekommt und wo der Output eben wieder ein long[] ist, welches nur noch alle gemeinsamen Elemente (mit Duplikaten) der Input-Arrays beinhaltet.
Also: Löse erstmal das Problem, wie du die Schnittmenge von nur zwei long[] Arrays berechnest. Wenn du das hast, kannst du per Reduktion auf beliebige Mengen von Arrays abstrahieren.
 
Könntest du mir erklären wie das gehen würde? Ich kenn zwar die methode reduce(), aber nur wie man damit zum Beispiel die Summe aller Zahlen eines Arrays herausfindet...
Eine einfache Verwendung wäre die reduce Methode, die ein BinaryOperator<T> nutzt:

BinaryOperator<T> ist eine BiFunction<T,T,T>, also wird eine Methode benötigt, die zwei Parameter vom Typ T hat und ein Ergebnis vom Typ T zurück gibt.

Wen Du die Arrays in einer List hast, dann wäre es vermutlich ein einfaches list.stream().reduce(this::schnittmenge) welches Dir dann ein Optional gibt.

Also sowas wie:
Java:
public class Test {
    public static void main (String[] args) {
        List<long[]> myList = List.of(......);
        long[] result = myList.stream().reduce(Test::schnittmenge).get();
    }

    public long[] schnittmenge(long[] a, long[] b) {
        // Deine Implementation von Schnittmenge
    }
}

(Im Forum schnell herunter getippt. Da mögen sich also Fehler eingeschlichen haben!)
 
Wen Du die Arrays in einer List hast, dann wäre es vermutlich ein einfaches list.stream().reduce(this::schnittmenge) welches Dir dann ein Optional gibt.

Also sowas wie:
Java:
public class Test {
    public static void main (String[] args) {
        List<long[]> myList = List.of(......);
        long[] result = myList.stream().reduce(Test::schnittmenge).get();
    }

    public long[] schnittmenge(long[] a, long[] b) {
        // Deine Implementation von Schnittmenge
    }
}
Danke!
 

Zurück
Oben