2013-02-10 4 views
0

Я хочу, чтобы мой код был чистым, есть следующие проблемы. Я хочу добавитьКак правильно объединить Hashmap <String, ArrayList <Object>> и HashMap <String, Object>

HashMap<String,Object> currentItem;

в моей памяти

HashMap<String, ArrayList<Object>> storage;

следующим образом:

Добавить все Object из currentItem в ArrayList<Object> из storage по клавишам (все они тоже самое).

Это мой вариант, как добавить CurrentItem на хранение в соответствии с ключами

if (storage.containsKey("article_link")) 
{Object tmpObj; 
    ArayList<Object> listTemp; 
      tmpObj = currentItem.get("article_link"); 
     listTemp = storage.get("article_link"); 
     listTemp.add(tmpObj); 
     storage.put("article_link", listTemp); 

     tmpObj = o.get("image"); 
     listTemp = storage.get("image"); 
     listTemp.add(tmp); 
     storage.put("image", rrr); 
} 

и этого для каждого ключа HashMap. Я могу написать специальную функцию для повторения кода, но я надеюсь, что ее можно решить проще.

Спасибо.

+0

Вам необходимо проверить нуль после вызова 'listTemp = output.get()'. Возможно, что текущая карта содержит ключи, отсутствующие в выходной карте. – user949300

+0

Что вам нужно, это неясно, но вас может заинтересовать MultiMap от guava (которые по существу являются некоторыми «Map >». – assylias

+0

@ user949300 Код обновления. Извините «output» это мое «хранилище» – pavelartlover

ответ

2

Следует отметить, что вам не нужно снова помещать отображение для нового массива, как только вы его модифицируете. Изменения будут отражены в Map автоматически, так как у вас есть ссылка на фактический объект ArrayList.

Во-вторых, вам не нужно делать все это hard-coding. Вы можете просто перебрать карту currentItem, а для каждой пары key-value проверить наличие key в storage, и если найдено, просто обновите соответствующий List.

Вот как это сделать: -

for (Entry<String, Object> entry: currentItem.entrySet()) { 
    if (storage.containsKey(entry.getKey()) { 
     storage.get(entry.getKey()).add(entry.getValue()); 

    } else { 
     List<Object> newEntry = new ArrayList<Object>(); 
     newEntry.add(entry.getValue()); 
     storage.put(entry.getKey(), newEntry); 
    } 
} 
+0

Спасибо за отличный ответ. Но в этом случае мы должны использовать «add» вместо «put». Независимо от того, спасибо. – pavelartlover

+1

Да, должен быть add(). И если в хранилище нет ключа, вы, вероятно, захотите создать новый List (как в двух других ответах). Наконец, рассмотрите возможность синхронизации этого метода. может произойти, если к хранилищу добавляются два разных потока. – user949300

+0

@pavelartlover. А! прав. Это должно быть 'add'. Отредактировано. :) –

0
for (Entry<String, Object> entry: currentItem.entrySet()) { 
    if (!storage.containsKey(entry.getKey()) { 
     storage.put(new ArrayList<Object>()); 
    } 
    storage.get(entry.getKey()).put(entry.getValue()); 
} 
0
Set<Entry<String,Object> entries = currentItem.entrySet(); 
Iterator<Entry<String,Object>> i = entries.iterator(); 
while(i.hasNext()) { 
    Entry<String,Object> e = i.next(); 
    if(storage.containsKey(e.getKey()) { 
     storage.get(e.getKey()).add(e.getValue()); 
    } 
    else { 
     ArrayList l = new ArrayList(); 
     l.add(e.getValue()); 
     storage.put(e.getKey(),l); 
    } 
} 
Смежные вопросы