Преобразование карты <Integer, Object> в карту <Integer, List <Object>> без использования циклов for (java) - PullRequest
0 голосов
/ 21 октября 2010

Как видно из заголовка, в настоящее время я реализую приведенный ниже код (это хорошо), это лучший способ - так как это кажется немного неприятным.

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

Вы можете попробовать ListMultimap .

от Guava.
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 голосов
/ 21 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...