2010-10-21 4 views
0

Как сказано в заголовке, в настоящее время я реализую приведенный ниже код (ну, вот-вот), это их лучший способ - как это кажется немного неприятным.Преобразование карты <Integer, Object> to Map <Integer, List <Object>>, без использования для циклов (java)

Map<Integer, List<Objects>> allObjectsMap = newHashMap(); //guava 

for(int i=1:i<myVar:i++){ 

    Map<Integer, Objects> eachObjectMap = getMyObjectMap(i); 

    for(Map.Entry<Integer, Object> entry:eachObjectMap.entrySet()){ 

     List objectList = allObjectsMap.get(entry.getKey()) 

     if(objectList == null){//will be null the first time 
      objectList = newArrayList();//guava 
      objectList.add(entry.getValue()); 
      allObjectsMap.put(entry.getKey(),objectList); 
     } 
     else{ 
      objectList.add(entry.getValue()); 
     } 
    } 
} 

Спасибо!

ответ

3

Возможно, вы захотите проверить Guava's ListMultimap.

Multimap<Integer, Object> multimap = ArrayListMultimap.create(); 
for (int i = 0; i < myVar; i++) { 
    multimap.putAll(Multimaps.forMap(getMyObjectMap(i))); 
} 
Map<Integer, Collection<Object>> allObjectsMap = multimap.asMap(); 

Одним из недостатков этого подхода состоит в том, что конечный результат имеет тип Map<K, Collection<V>> и не Map<K, List<V>>. Тем не менее, ListMultimap.asMap() Javadoc гласит:

Хотя метод подписи не так сказать явно, возвращаемый карта имеет значения списка.

Таким образом, некоторая последовательность отливок (например, (Map<Integer, List<Object>>) (Map<Integer, ?>)) будет работать.

+0

Я не думаю, что вам нужна общая информация о ArrayListMultimap. create(), более простым решением будет ArrayListMultimap.create() – nanda

0

Не можете ли вы просто бросить его? Java стирает всю информацию о типе в сгенерированном коде, поэтому этого должно быть достаточно.

+0

Он не указывает нигде, что объект на его карте, по сути, является списком. Кастинг это просто приведет к исключению ClassCastException, когда он извлечет элемент из своей карты. –

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