将Map <integer,object =“”>转换为Map <integer,list <object =“”>&gt;,而不使用for循环(java)</integer,> </integer,>

时间:2010-10-21 09:42:51

标签: java optimization hashmap

正如标题所说,我目前正在实施以下代码(即将推出),这是他们更好的方式 - 因为这看起来有点讨厌。

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 个答案:

答案 0 :(得分: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, ?>))会起作用。

答案 1 :(得分:0)

难道你不能施展它吗? Java会删除生成的代码中的所有类型信息,因此它应该足够了。

相关问题