2010-10-21 10 views
0

Comme le dit le titre, je suis actuellement en train de mettre en œuvre le code ci-dessous. - Comme cela semble un peu méchant.Conversion d'une carte <Entier, Objet> en Carte <Entier, Liste <Object>>, sans utiliser pour les boucles (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()); 
     } 
    } 
} 

Merci!

Répondre

3

Vous pouvez consulter le ListMultimap de 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(); 

Un inconvénient de cette approche est que le résultat final est de type Map<K, Collection<V>> et non Map<K, List<V>>. Cependant, le ListMultimap.asMap() Javadoc déclare:

Bien que la signature de la méthode ne dire explicitement, la carte retournée a des valeurs de la liste.

Par conséquent, certaines séquences de moulages (par exemple (Map<Integer, List<Object>>) (Map<Integer, ?>)) fonctionneraient.

+0

Je ne pense pas que vous ayez besoin d'informations génériques sur ArrayListMultimap. create(), une solution plus simple serait ArrayListMultimap.create() – nanda

0

Ne pouvez-vous pas le lancer? Java efface toutes les informations de type dans le code généré, donc cela devrait suffire.

+0

Il n'indique nulle part que les objets sur sa carte sont, en fait, des listes. Le lancer donnerait juste une ClassCastException quand il récupère un élément de sa carte. –