【问题标题】:Converting a Map<Integer, Object> to Map<Integer, List<Object>>, without using for loops (java)将 Map<Integer, Object> 转换为 Map<Integer, List<Object>>,而不使用 for 循环 (java)
【发布时间】:2010-10-21 18:08:53
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: java optimization hashmap


    【解决方案1】:

    你不妨看看 Guava 的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&lt;K, Collection&lt;V&gt;&gt; 而不是Map&lt;K, List&lt;V&gt;&gt;。但是,ListMultimap.asMap() Javadoc 声明:

    虽然方法签名没有 明确地说,返回的地图 有列表值。

    因此,某些类型的转换(例如,(Map&lt;Integer, List&lt;Object&gt;&gt;) (Map&lt;Integer, ?&gt;))会起作用。

    【讨论】:

    • 我认为您不需要有关 ArrayListMultimap.create() 的通用信息,更简单的解决方案是 ArrayListMultimap.create()
    【解决方案2】:

    你不能直接施放吗? Java 会擦除生成代码中的所有类型信息,所以应该足够了。

    【讨论】:

    • 他没有在任何地方说明他的地图中的对象实际上是列表。当他从地图中检索项目时,投射它只会产生 ClassCastException。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2015-06-24
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多