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...
}
Since Java 8, there is an excelent short solution with lambda:
or you can use more concise way by passing method reference
stringIDMap.values().removeIf(Set::isEmpty);
In order to avoid
ConcurrentModificationException
, you need to use theIterator
interface directly: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.