2015-07-20 50 views
1

我需要从函数返回一个HashMap的子集。那么什么是更好的方法或最有效的方法:什么是获取HashMap中元素子集的有效方法?

a。遍历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

当你知道你想迭代一个HashMap时,LinkedHashMap允许你迭代这些值 – Simon

回答

4

a。将在原始地图上单次传递,并且只复制你想要的新地图的条目

b。将在原始地图上进行第一遍并将所有条目复制到新地图上,然后在新地图上执行第二遍并删除所有不需要的条目

当然,a更快。

如果不是在keySet上迭代并从映射中获取相应的值,而是在entrySet上迭代并直接从条目中获取相应的值,那么速度会更快。

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

0

在最坏的情况下它应该是相同的复杂性/优化。在地图地图类也迭代元件的retainAll方法,则调用contain方法(可参考OpenJDK源码或this post

但是,如果溶液一个。被初始化为空映射。我认为它应该比解决方案b更好。由于解决方案中有更多的操作b。

相关问题