2015-07-20 123 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。

相關問題