2013-04-08 36 views
4

我有一個將字符串鍵映射到哈希集值的哈希映射,並且當hashmaps的哈希集值爲空時,我想從哈希映射中移除一個鍵。我在解決這個問題時遇到了麻煩。這是我做過嘗試,但我很卡:當值的哈希集爲空時,移除哈希映射中的鍵

for(Map.Entry<String, HashSet<Integer>> entr : stringIDMap.entrySet()) 
{ 

       String key = entr.getKey(); 

       if (stringIDMap.get(key).isEmpty()) 
       { 

        stringIDMap.remove(key); 
        continue; 
       } 
    //few print statements... 
} 
+0

對於某些字符串,hashmap中的值即HashSet 是否爲null?你現在面臨的問題是什麼?獲得NullPointer? – JRR 2013-04-08 06:11:31

回答

17

爲了避免ConcurrentModificationException,你需要直接使用Iterator接口:

Iterator<Map.Entry<String, HashSet<Integer>>> it = stringIDMap.entrySet().iterator(); 
while (it.hasNext()) { 
    Map.Entry<String, HashSet<Integer>> e = it.next(); 
    String key = e.getKey(); 
    HashSet<Integer> value = e.getValue(); 
    if (value.isEmpty()) { 
     it.remove(); 
    } 
} 

當前的代碼不在理由工作是你試圖從地圖上移除元素,同時迭代它。當你調用​​時,這會使for-each循環在封面下使用的迭代器失效,從而無法進一步迭代。

it.remove()解決了這個問題,因爲它不會使迭代器無效。

+2

這可能是他卡在... – Thihara 2013-04-08 06:10:38

+0

正是我得到的錯誤。謝謝 – Sempiternal 2013-04-08 06:14:17

1
Iterator<String> iterator = mMapFiles.keySet().iterator(); 
    while (iterator.hasNext()){ 
     if (mMapFiles.get(iterator.next()).size() < 1) 
      iterator.remove(); 
    }