在HashMap中获取元素子集的有效方法是什么?

时间:2015-07-20 07:15:42

标签: java hashmap

我需要从函数返回HashMap的子集。那么什么是更好的方法或最有效的方法:

一个。迭代HashMap键,以我的条件为准,将它们添加到本地创建的HashMap并返回它

湾克隆HashMap并使用retainAll方法。

即:

private HashMap<Long, List<Files>> abc(HashMap<Long, List<Files> mainMap, Set<Long> setNeeded){
    HashMap<Long, List<Files>> retVal = new HashMap<Long, List<Files>>(mainMap);
    for(Long timeStamp : mainMap.keySet()){
      if(setNeeded.contains(timeStamp){
        retVal.put(timeStamp, mainMap.get(key));
      }
    }
  return retVal;
}

private HashMap<Long, List<Files>> abc(HashMap<Long, List<Files> mainMap, Set<Long> setNeeded){
    HashMap<Long, List<Files>> retVal = new HashMap<Long, List<Files>>(mainMap);
    retVal.retainAll(setNeeded);
    return retVal;
}

还是既优化又高效?

2 个答案:

答案 0 :(得分:4)

一个。将在原始地图上执行一次传递,并仅将您想要的条目复制到新地图

湾将在原始地图上进行第一次传递并将所有条目复制到新地图,然后在新地图上进行第二次传递并删除所有不需要的条目

当然,a比b更快。

如果不是在keySet上迭代并从map中获取相应的值,而是在entrySet上迭代,并直接从条目中获取相应的值,那就更快了。

也不是代码有错误:它复制原始地图而不是从空地图开始。

答案 1 :(得分:1)

在最坏的情况下应该是相同的复杂性/优化。 Map类的retainAll方法也迭代地图中的元素,然后调用contain方法(可以引用OpenJDK源或this post

但是如果解决方案 a。被初始化为空地图。我认为它应该比解决方案 b。更好,因为解决方案 b中有更多操作。