2017-03-13 4 views
0

Ich habe 2 List<Map<String, String>> Objekte, die sich überschneidende Daten haben, die ich OUTER JOIN verlassen möchte, als ob ich ein DBMS abfragen würde. Hier ist eine Beschreibung der Karten in jeder Liste:Wie simuliere ich eine 'LINKE OUTER JOIN' mit List <Map <String, String >> Objekte in Java 6?

Karte A Schlüssel: id, Ressource, Adresse

Daten der Liste 1:

[ 
(id=1, resource="a", address="123 abc"), (id=2, resource="b", address="987 xyz") 
] 

Karte B Tasten: id, name

List 2 Daten:

[ 
(id=1, name="ZYX"), (id=1, name="WVU") 
] 

Was würde ich gerne auf den ‚id‘ Schlüssel zu tun, ist passend und am Ende mit den folgenden List<Map<String, String>>:

[ 
(id=1, resource="a", address="123 abc", name="ZYX"), 
(id=1, resource="a", address="123 abc", name="WVU"), 
(id=2, resource="b", address="987 xyz") 
] 

Zuerst habe ich versucht, unter Verwendung von Collections.compare();

  1. jedes Element aus der ersten Liste Taking>
  2. den entsprechenden Eintrag zu finden, in den zweiten List<Map<String, String>>
  3. Merging das Element aus dem ersten Punkt und das Spiel (falls vorhanden) auf ‚id‘ in ein neues Element
  4. Hinzufügen das neue Element in eine neue List<Map<String, String>>

Welche der auf der einen Seite Griffe JOIN, aber nicht auf der anderen Seite. Ich habe immer einen Datensatz mit 'id' = 1 und einen Datensatz mit 'id' = 2.

Ich bin mir bewusst, dass dies viel einfacher sein würde Streams mit Java 8 oder höher, aber ich bin mit Java 6.

stecken
+0

Dies ist unklar. In der Map 'B' haben Sie doppelte Schlüssel, vorausgesetzt, der Schlüssel ist 'id'. Wenn der Schlüssel aus _both_ 'id' und' name' besteht, gibt es keine Übereinstimmung mit irgendetwas in Map'A, da es keinen 'name' in' A' gibt. Du wirst das mehr klären müssen. –

+0

@JimGarrison Es gibt keine Karte B. Es ist eine Liste von Karten, mit dem gleichen Satz von Schlüsseln, einige Zuordnung zu identischen Werten. – shmosel

+0

OK, ich sehe das, aber ich glaube, die Aussage 'Map A Schlüssel: ID, Ressource, Adresse' sollte' Map A Schlüssel: ID, Wert: (Ressource, Adresse) 'für den Rest der Frage sinnvoll sein. –

Antwort

0
List<Map<String, String>> merged = new ArrayList<Map<String, String>>(); 
for (Map<String, String> map1 : list1) { 
    boolean found = false; 
    for (Map<String, String> map2 : list2) { 
     if (map1.get("id").equals(map2.get("id"))) { 
      found = true; 
      Map<String, String> copy = new HashMap<String, String>(); 
      copy.putAll(map1); 
      copy.putAll(map2); 
      merged.add(copy); 
     } 
    } 
    if (!found) { 
     merged.add(map1); 
    } 
} 
+0

Vielen Dank für Ihre Hilfe bei meinem Fall von Block-Autoren. Ich werde dein Beispiel testen und zurückmelden. – bakoyaro

+0

danke nochmal für die Hilfe! (Ich habe deine Antwort hochgestuft ...) – bakoyaro

Verwandte Themen