2017-02-21 58 views
0

У меня есть два хэшмапа, которые мне нужно объединить.Объединение двух хэш-карт с одним и тем же ключом и одинаковыми или разными значениями

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

Если я создаю карту 3 и сделаю addAll(), некоторые значения будут перезаписаны. Как и в случае с Организацией, я получаю только Королевскую комиссию и Юнайтед. Я написал код слияния для двоих, но получаю исключение с нулевым указателем. Я просто хочу знать, правильно ли этот подход. Я буду отлаживать и выяснять, почему я получаю исключение.

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

ответ

1

Эта линия:

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

должно быть:

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

UPDATE:

Oh! и то же самое для bValues ​​

UPDATE 2:

Еще одна проблема: entriesA.contains (AKEY) должен быть a.contains (AKEY)

UPDATE 3:

Попробуйте что-то вроде этого:

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:

Чтобы избежать дублирования значение s, замените строку:

 cValues.addAll(bValues); 

С:

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

это будет иметь дело только с дубликатами, созданных в результате слияния, хотя, а не те, которые уже существуют.

+0

Спасибо! Но этот код, похоже, не работает. Я избавился от исключения нулевого указателя, но значения все равно перезаписываются. – serendipity

+0

@serendipity см. Update –

+0

перед первым циклом, c пуст, поэтому, поскольку ключи все разные, c не может содержать текущий ключ, поэтому никакого теста не требуется. –

 Смежные вопросы

  • Нет связанных вопросов^_^