2010-10-21 49 views
0

正如標題所示,我目前正在實現下面的代碼(以及將要實現的),它們是更好的方法 - 因爲這看起來有點討厭。將Map <Integer,Object>轉換爲Map <Integer,List <Object>>,不使用for循環(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

你可能想看看番石榴的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 2010-10-21 10:07:44

0

難道你不能施展它嗎? Java會擦除生成的代碼中的所有類型信息,因此它應該足夠了。

+0

他沒有聲明他的地圖中的對象實際上是列表中的任何地方。當他從他的地圖中檢索一個項目時,投射它只會產生ClassCastException。 – 2010-10-21 11:06:09

相關問題