2017-02-21 2 views
0

J'ai deux hashmaps à fusionner. Si je crée la carte 3 et que je fais un addAll(), certaines valeurs sont remplacées. Comme dans le cas de l'organisation je reçois seulement la Commission royale et United est écrasé. J'ai écrit un code de fusion pour les deux mais obtenir une exception de pointeur null. Je veux juste savoir si cette approche est correcte. Je vais déboguer et comprendre pourquoi je reçois l'exception.Combinaison de deux hashmaps avec la même clé et des valeurs identiques ou différentes

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; 
       } 

Répondre

1

Cette ligne:

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

devrait être:

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

MISE À JOUR:

Oh! et même pour bValues ​​

MISE À JOUR 2:

Encore une autre question: entriesA.contains (AKEY) devrait être a.contains (aKey)

MISE À JOUR 3:

Essayez quelque chose comme ceci:

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; 

MISE à JOUR 4:

Pour éviter valeur en double s, remplacer la ligne:

 cValues.addAll(bValues); 

Avec:

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

Cela n'occuperons de ceux créés par la fusion, mais pas ceux qui existaient déjà.

+0

Merci! Mais ce code ne semble pas fonctionner. Je me suis débarrassé de l'exception du pointeur nul mais les valeurs sont toujours écrasées. – serendipity

+0

@serendipity voir la mise à jour –

+0

avant la première boucle, c est vide, donc, comme les touches sont toutes différentes, c ne peut pas contenir la clé actuelle, donc pas de test nécessaire. –