Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove a key in hashmap when the value's hashset is Empty

I have a hashmap that maps strings keys to hashsets values, and I want to remove a key from the hashmap when the hashmaps's hashset value is empty. I'm having trouble approaching this. Here's what I've tried but I'm very stuck:

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...
}
like image 838
Sempiternal Avatar asked Apr 08 '13 06:04

Sempiternal


1 Answers

In order to avoid ConcurrentModificationException, you need to use the Iterator interface directly:

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

The reason your current code doesn't work is that you are attempting to remove elements from the map while iterating over it. When you call stringIDMap.remove(), this invalidates the iterator that the for-each loop uses under the cover, making further iteration impossible.

it.remove() solves this problem as it does not invalidate the iterator.

like image 110
NPE Avatar answered Oct 09 '22 09:10

NPE