2017-02-21 3 views
0

Ich habe zwei hashmaps, die ich zusammenführen muss.Kombinieren von zwei hashmaps mit dem gleichen Schlüssel und gleichen oder verschiedenen Werten

MAP 1 - [[LOCATION: United Kingdom], [PERSON: Alfred Theodore MacConkey], [ORGANIZATION: Royal Commission, United]] 

MAP 2 -{LOCATION=[United Kingdom], ORGANIZATION=[Royal Commission], PERSON=[Alfred Theodore MacConkey]} 

Wenn ich Map 3 erstellen und eine addAll() tun, werden einige Werte überschrieben. Wie bei ORGANISATION bekomme ich nur Royal Commission und United wird überschrieben. Ich habe einen Merge-Code für die beiden geschrieben, bekomme aber eine Null-Pointer-Ausnahme. Ich möchte nur wissen, ob dieser Ansatz richtig ist. Ich werde debuggen und herausfinden, warum ich die Ausnahme bekomme.

public static LinkedHashMap<String,Vector<String>> merge(HashMap<String, Vector<String>> a, HashMap<String, Vector<String>> b) { 
        LinkedHashMap<String,Vector<String>> c = new LinkedHashMap<String,Vector<String>>(); 


        Set<Entry<String,Vector<String>>> entriesA = a.entrySet(); 
        Set<Entry<String,Vector<String>>> entriesB = b.entrySet(); 

        for (Map.Entry<String, Vector<String>> entry : entriesA) { 

         Vector<String> aValues = a.get(entry.getValue()); 
         String aKey = entry.getKey(); 

         Vector<String> allValues = entriesA.contains(aKey) ? a.get(aKey) : new Vector<String>(); 
         allValues.addAll(aValues); 

         c.put(aKey, allValues); 

        } 



        for (Map.Entry<String, Vector<String>> entry : entriesB) { 
         Vector<String> bValues = b.get(entry.getValue()); 
         String bKey = entry.getKey(); 

         if(c.containsKey(bKey) && c.get(bKey).equals(bValues)) { 
          continue; 
          } 
         else if(c.containsKey(bKey) && !(c.get(bKey).equals(bValues))) { 
          c.put(bKey, bValues); 
         } 
        } 
        return c; 
       } 

Antwort

1

Diese Zeile:

Vector<String> aValues = a.get(entry.getValue()); 

sollte sein:

Vector<String> aValues = entry.getValue(); 

UPDATE:

Oh! und Gleiches gilt für bValues ​​

UPDATE 2:

Noch ein weiteres Problem: entriesA.contains (aKey) sollte a.contains sein (aKey)

UPDATE 3:

Probieren Sie etwas wie folgt aus:

LinkedHashMap<String, Vector<String>> c = new LinkedHashMap<String, Vector<String>>(); 

    for (Map.Entry<String, Vector<String>> entry : a.entrySet()) { 
     Vector<String> aValues = entry.getValue(); 
     String aKey = entry.getKey(); 
     c.put(aKey, new Vector<String>(aValues)); 
    } 
    for (Map.Entry<String, Vector<String>> entry : b.entrySet()) { 
     Vector<String> bValues = entry.getValue(); 
     String bKey = entry.getKey(); 
     Vector<String> cValues = c.get(bKey); 
     if (cValues == null) { 
      c.put(bKey, new Vector<String>(bValues)); 
     } else { 
      cValues.addAll(bValues); 
     } 
    } 
    return c; 

UPDATE 4:

doppelten Wert zu vermeiden s, ersetzen Linie:

 cValues.addAll(bValues); 

mit:

Set<String> values = new HashSet<String>(cValues); 
values.addAll(bValues); 
cValues.clear(); 
cValues.addAll(values); 

nur dies wird mit Dubletten beschäftigen obwohl durch die Zusammenführung geschaffen, nicht diejenigen, die bereits existierten.

+0

Danke! Aber dieser Code scheint nicht zu funktionieren. Ich habe die Nullzeiger-Ausnahme beseitigt, aber die Werte werden immer noch überschrieben. – serendipity

+0

@Serendipity siehe Update –

+0

vor der ersten Schleife, c ist leer, so, wie die Schlüssel alle unterschiedlich sind, kann c nicht den aktuellen Schlüssel enthalten, daher ist kein Test erforderlich. –

Verwandte Themen