Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen

Dorfschmied

Neues Mitglied
Hallo, ich versuche aus zwei Listen ein Kartesisches Produkt zu bilden, was in etwa wie folgt aussehen soll:
Beispiel:
d1 = [{Year = 1976, PersonID = 1},
    {Year = 1987, PersonID = 3},
    {Year = 1974, PersonID = 2}]
    
    d2 = [{PersonID = 0,houseID = H-101},
    {PersonID = 1, houseID = H-202}]
    
    d3 = [{Year = 1976, PersonID = 1,PersonID = 0,houseID = H-101},
    {Year = 1976, PersonID = 1,PersonID = 1, houseID = H-202},
    {Year = 1987, PersonID = 3,PersonID = 0,houseID = H-101},
    {Year = 1987, PersonID = 3,PersonID = 1, houseID = H-202},
    {Year = 1974, PersonID = 2,PersonID = 0,houseID = H-101},
    {Year = 1974, PersonID = 2,PersonID = 1, houseID = H-202}]

Jetzt bin ich mit meinem Code lediglich so weit gekommen:
Java:
public static List<Map<String, String>> kartesischesProdukt(List<Map<String, String>> d1, List<Map<String, String>> d2) {
        List<Map<String, String>> result = new ArrayList<>();

        int s1 = d1.size();
        int s2 = d2.size();

        for (int i = 0; i < s1; i++) {
            for (int j = 0; j < s2; j++) {
                d3.add(d1.get(i));
                d3.add(d2.get(j));
            }
        }
        return d3;
    }

Was mir lediglich diesen den Output liefert:
Java:
d3 =
d3 = [{Year = 1976, PersonID = 1},{PersonID = 0,houseID = H-101},
    {Year = 1976, PersonID = 1},{PersonID = 1, houseID = H-202},
    {Year = 1987, PersonID = 3},{PersonID = 0,houseID = H-101},
    {Year = 1987, PersonID = 3},{PersonID = 1, houseID = H-202},
    {Year = 1974, PersonID = 2},{PersonID = 0,houseID = H-101},
    {Year = 1974, PersonID = 2},{,PersonID = 1, houseID = H-202}]

Eine neue Hashmap möchte ich nicht erstellen, kann mir jemand weiterhelfen?
LG
 

kneitzel

Top Contributor
Also irgendwie passt das doch alles nicht. Eine Map ist immer ein key -> value, wobei key eindeutig ist.
Und wenn Du da nun je einen Datensatz von jeder Map hast, dann hast Du als Ergebnis doch kein List<Map>. Du hast dann ja keine Map mehr sondern nur noch 2 einzelne Datensätze - einer aus jeder Map!

Also nur um es noch mal deutlich zu machen:
Du hat map1 und aus der bekommst Du key1, value1.
Und map2 aus der du key2, value2 bekommst.

Im Ergebnis hast Du dann also etwas, bei deren Elementen Du dann key1, value1, key2 und value2 unterbringen musst.

Da beide Maps die gleichen Typen für key und value haben, kannst Du das ggf. zusammen fassen. Dann könntest Du evtl. auf eine List<Map> kommen. Aber list<Map> bedeutet natürlich, dass Du eine Liste von Maps hast -> Du musst also neue Maps erzeugen! Wobei die Frage ist, ob das überhaupt irgend einen Sinn ergibt.

Schauen wir einfach mal auf eine Datenbank: Du hast zwei Tabellen. Das können also einfache Datensatz-Mengen sein. Prinzipiell geht es auch als Map, dann hat man halt einen unique index, z.B. ein primary Key. Wenn Du die dann verknüpfst ohne Bedingung, dann kommt eben das Resultat heraus: Du hast eine "Tabelle" mit den Spalten aus Tabelle1 und Tabelle2. Da hast Du dann aber keinen Primary Key mehr. (Wobei das auch noch denkbar wäre: Eine Kombination aus eben den beiden Primary Keys.)

Das Ergebnis, das man da also jetzt erwarten würde: Du hast zwei mal zwei Spalten -> Liste von 4 Spalten.
 

httpdigest

Top Contributor
Wenn wir eine Map als Set/Menge von Paaren betrachten (also Key/Value-Paare), dann macht das schon Sinn, denke ich.
Es gibt nur die Einschränkung, dass beim "Mergen" von jeweils zwei Maps/Sets diese Maps Einträge zumselben Schlüssel enthalten könnten (also Paare mit demselben ersten Element). Hier muss man eine Konfliktbehandlung durchführen.
Die Behandlung kann lauten: die "zweite" Map beim Merge überschreibt einfach immer den Eintrag aus der "ersten" Map, oder andersherum oder: Exception
Wenn du zur Implementierung z.B. die Methode Map.merge() verwendest, darfst du die Konfliktbehandlung selbst als Methode implementieren. Wenn du den toMap Collector (mit Streams) verwendest, dann gibt's eine Exception bei duplicate Keys oder, du verwendest auch hier die Überladung mit der expliziten Konfliktbehandlung als Parameter.
Eine mögliche Stream-Implementierung könnte z.B. so aussehen:
Java:
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Stream.concat;
public class Cartesian {
  private static <K, V> Map<K, V> mergeTwoMaps(
          Map<K, V> a, Map<K, V> b) {
      return concat(a.entrySet().stream(), b.entrySet().stream())
            .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
  }
  public static <K, V> List<Map<K, V>> cartesianProduct(
          List<Map<K, V>> a, List<Map<K, V>> b) {
      return a.stream()
              .flatMap(ae -> b.stream().map(be -> mergeTwoMaps(ae, be)))
              .collect(toList());
  }

  // test
  public static void main(String[] args) {
      System.out.println(cartesianProduct(
        List.of(Map.of("a", 1, "b", 2), Map.of("a", 3, "b", 4)),
        List.of(Map.of("c", 5, "d", 6), Map.of("c", 7, "d", 8))));
  }
}
 

kneitzel

Top Contributor
@httpdigest das ist ein interessanter Gesichtspunkt. Aber damit hast Du dann doch nicht die erwartete Lösung, welche ja die 4 Elemente in der Zielmenge zeigt:
Code:
 d3 = [{Year = 1976, PersonID = 1,PersonID = 0,houseID = H-101},
    {Year = 1976, PersonID = 1,PersonID = 1, houseID = H-202},
    {Year = 1987, PersonID = 3,PersonID = 0,houseID = H-101},
    {Year = 1987, PersonID = 3,PersonID = 1, houseID = H-202},
    {Year = 1974, PersonID = 2,PersonID = 0,houseID = H-101},
    {Year = 1974, PersonID = 2,PersonID = 1, houseID = H-202}]

Und vom Verständnis her: Ist das, was Du da machst, denn dann noch das Kartesische Produkt? Das ist ja definiert als:
A x B := { (a,b) | a € A, b € B} (€ als Ersatz für das "Element aus" Zeichen genommen ... )

Und A als auch B sind ja Mengen, die sich als 2-Tupel darstellen (Mit zusätzlichen Regeln, die uninteressant sind, da wir die Mengen ja nicht modifizieren wollen sondern nur in der Operation nutzen wollen).

Und ich habe das auch noch einmal schnell nachgeschlagen und dazu https://de.wikipedia.org/wiki/Kartesisches_Produkt überflogen und das schien sich mit meinem Verständnis zu decken.

Das was Du machst ist doch:
A := Vereinigungsmenge der Keys beider Maps
B := Vereinigungsmenge der Values beider Maps (Da bekomme ich leichte Bauchschmerzen - damit wirfst Du ja PersonID und HouseID zusammen in eine Menge .. Sieht nicht vielversprechend aus.
Und von diesen neuen Mengen erstellst Du das kartesische Produkt.

Oder habe ich da jetzt etwas falsch verstanden / übersehen? Da die Antwort von Dir gekommen ist, würde ich erst einmal davon ausgehen, dass ich irgendwas übersehen haben muss.

Edit: Die Formel hat er im Editor schön eingefügt als Bild, aber das scheint nicht geklappt zu haben. Daher einmal in Textform ersetzt. Sorry für die nicht gute Darstellung.
 

httpdigest

Top Contributor
@kneitzel du hast natürlich 100%ig Recht! :) Ich habe mir seine Beispiele oben gar nicht ganz genau angesehen (leider).
Was er vorhat, geht natürlich dann auch mit Maps nicht, also sowas wie:
{Year = 1987, PersonID = 3,PersonID = 0,houseID = H-101}
PersonID kann ja nicht gleichzeitig 3 und 0 sein.
Er braucht also keine Map, sondern _wirklich_ Tupel/Paare.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Produkt d. Ziffern einer Zahl..?! Java Basics - Anfänger-Themen 5
T Produkt eines mehrdimensionalen Arrays Java Basics - Anfänger-Themen 5
Ocram Methoden Produkt eines Intervalls Java Basics - Anfänger-Themen 11
F Größtes Produkt in einem String Java Basics - Anfänger-Themen 4
H pi näherungsweise berechnen - Wallis Produkt Java Basics - Anfänger-Themen 9
R Produkt berechnen Java Basics - Anfänger-Themen 23
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
T Produkt 1-10 mit Zwischenschritten Java Basics - Anfänger-Themen 7
N Matrix Matrix Produkt Java Basics - Anfänger-Themen 7
D The constructor Bestellung(Bestellung.Produkt, Bestellung.Kunde) is undefined Java Basics - Anfänger-Themen 15
B Produkt ohne Multiplizieren? Java Basics - Anfänger-Themen 7
N Produkt Java Basics - Anfänger-Themen 2
U Summe produkt von einem array Java Basics - Anfänger-Themen 9
T Geht so was? public void verkaufe (<X implements Produkt& Java Basics - Anfänger-Themen 8
S mehrere Erweiterungen fürs Produkt Java Basics - Anfänger-Themen 6
J tast-Eingabe_(Vektor)Skalar-produkt Java Basics - Anfänger-Themen 19
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
M Wie kann ich ein Array in zwei Hälften aufteilen? Java Basics - Anfänger-Themen 12
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
A Zwei XML-Dateien Mergen Java Basics - Anfänger-Themen 14
U Erste Schritte nextGaussian zwischen zwei Werten Java Basics - Anfänger-Themen 19
S Multiplikation von zwei Labels Java Basics - Anfänger-Themen 7
U zwei 2D arrays auf gleich sein überprüfen Java Basics - Anfänger-Themen 14
Bademeister007 Elemente aus zwei verschiedenen Arrays miteinander vergleichen und gegeben falls entfernen Java Basics - Anfänger-Themen 14
Düsseldorf2002 Datentypen Zwei dimensionale LinkedList Java Basics - Anfänger-Themen 8
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
pkm Regexproblem - Wie kann ich zwei oder mehr beliebige Zeichen matchen? Java Basics - Anfänger-Themen 7
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
H Ein gegebenes Int Array zu Zwei Arrays zurück geben Java Basics - Anfänger-Themen 6
J zwei String Arrays miteinander vergleichen Java Basics - Anfänger-Themen 18
R Methode zwei Sortierkriterien der Klasse Comparator übergeben Java Basics - Anfänger-Themen 4
B Collections.sort mit zwei Bedingungen? Java Basics - Anfänger-Themen 4
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
L Zwei sortierte Subarrays mit gleicher Länge zusammenfügen Java Basics - Anfänger-Themen 2
F Zwei Dimensionles Array Java Basics - Anfänger-Themen 21
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
J Inhalte von zwei Arrays vertauschen?! Java Basics - Anfänger-Themen 6
O zwei Arrays nach Werten durchsuchen und zusammenfügen Java Basics - Anfänger-Themen 3
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
B Relativen Anteil von zwei Datümer auf Monatsebene umrechnen Java Basics - Anfänger-Themen 130
W Zwei Programme sollen auf eine Klasse zugreifen Java Basics - Anfänger-Themen 18
B Rückgabe von zwei Werten: String und double Java Basics - Anfänger-Themen 14
J Zwei Klassen die sich gegenseitig referenzieren - Bad practice? Java Basics - Anfänger-Themen 4
B Anzahl von Stunden / Tage von zwei Datumswerten ermitteln Java Basics - Anfänger-Themen 1
L Erste Schritte Elemente zwei Schlangen vergleichen Java Basics - Anfänger-Themen 14
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
D Input/Output InputDialog mit zwei Inputfeldern? Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Logging erzeugt zwei dateien.... Java Basics - Anfänger-Themen 7
S zwei-dimensionales Array Java Basics - Anfänger-Themen 20
R Zwei Attribute gleichzeitig ausgeben Java Basics - Anfänger-Themen 12
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
H Bubblesort-Zwei Integer auf Dekade vergleichen. Java Basics - Anfänger-Themen 6
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
jaleda100 KeyCode – zwei Tasten gleichzeitig Java Basics - Anfänger-Themen 2
M Methoden Zwei Methoden in einem Program laufen lassen...aber wie? Java Basics - Anfänger-Themen 2
M Methoden zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
B Erste Schritte Problem bei der Verknüpfung von zwei klassen Java Basics - Anfänger-Themen 8
J Methoden Zwei Methoden die fast das gleiche tun organisieren Java Basics - Anfänger-Themen 3
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
J Ein Objekt and eine Methode übergeben zwei Schreibweisen? Java Basics - Anfänger-Themen 6
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Classpath Zwei Bibliotheken enthalten gleiche .class Datei Java Basics - Anfänger-Themen 6
S OOP Zwei JSlider in einer Klasse Java Basics - Anfänger-Themen 2
P Aus einem Array zwei Arrays machen Java Basics - Anfänger-Themen 3
ArkHeat Erste Schritte Zwei 2-dimensionale Matritzen addieren Java Basics - Anfänger-Themen 0
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
T OOP Zwei Klassen Testen (Arrary Iterieren) Java Basics - Anfänger-Themen 6
E Eine Instanzvariable und zwei Objekte Java Basics - Anfänger-Themen 14
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
P Verbindung von Zwei Kreisen löschen ! Java Basics - Anfänger-Themen 6
J Zwei String-Variabeln vergleichen Java Basics - Anfänger-Themen 5
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
J Hilfe beim "Verknüpfen" von zwei Klasse Java Basics - Anfänger-Themen 15
N Mit der gleichen BlockingQueue in zwei Klassen arbeiten Java Basics - Anfänger-Themen 12
S Methoden Vergleichen von zwei Listen in der Geschwindigkeit von O(n+m) Java Basics - Anfänger-Themen 32
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
W OOP Zwei Objekte beziehen sich aufeinander (Zirkelbezug)? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben