2010-10-21 227 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

相关问题