How to remove a key from HashMap while iterating over it?
Try:
Iterator<Map.Entry<String,String>> iter = testMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String,String> entry = iter.next();
if("Sample".equalsIgnoreCase(entry.getValue())){
iter.remove();
}
}
With Java 1.8 and onwards you can do the above in just one line:
testMap.entrySet().removeIf(entry -> "Sample".equalsIgnoreCase(entry.getValue()));
Delete elements from Hashmap while iterating over it
To remove a element whilst in the middle of iterating, use Iterator.remove()
.
iterating over and removing from a map
As of Java 8 you could do this as follows:
map.entrySet().removeIf(e -> <boolean expression>);
Oracle Docs: entrySet()
The set is backed by the map, so changes to the map are reflected in the set, and vice-versa
Can I use keySet to modify HashMap during iteration?
The HashMap.keySet() method states more precisely:
The set is backed by the map, so changes to the map are reflected in
the set, and vice-versa.
It means that the elements returned by keySet()
and the keys of the Map
refer to the same objects. So of course changing the state of any element of the Set
(such as key.setFoo(new Foo());
) will be reflected in the Map keys and reversely.
You should be cautious and prevent the map from being modified during the keyset()
iteration :
If the map is modified while an iteration over the set is in progress
(except through the iterator's own remove operation), the results of
the iteration are undefined
You can remove entries of the map as :
The set supports element removal, which removes the corresponding
mapping from the map, via the Iterator.remove, Set.remove, removeAll,
retainAll, and clear operations.
But you cannot add entries in :
It does not support the add or addAll operations.
So in conclusion, during keySet()
iterator use Set.remove()
or more simply iterate with the Iterator
of the keySet
and invoke Iterator.remove()
to remove elements from the map.
You can add new elements in a temporary Map that you will use after the iteration to populate the original Map.
For example :
Map<Key, Value> map = getMap(); // map generating is hidden
Map<Key, Value> tempMap = new HashMap<>();
for (Iterator<Key> keyIterator = map.keySet().iterator(); keyIterator.hasNext();) {
Key key = keyIterator.next();
if (isToRemove(key)) {
keyIterator.remove();
}
else {
tempMap.put(key, getNewValue());
}
}
map.putAll(tempMap);
Edit :
Note that as you want to modify existing entries of the map, you should use an Map.EntrySet
as explained in the Stuart Marks answer.
In other cases, using an intermediary Map
or a Stream
that creates a new Map is required.
Remove elements from hashset inside hashmap while iterating through java stream
you can use forEach:
placementByConcept.entrySet().forEach(e -> e.getValue().removeIf(s -> s.getBeatObjectiveId().equals("non-scored")));
Related Topics
How to Deserialize Js Date Using Jackson
How to Specify the Root Context in Your <Web-App> Tags in Web.Xml
Compare Two Objects in Java with Possible Null Values
Annotation @Transactional. How to Rollback
Loading a Text File into a Textarea
Facebook Offline Access Step-By-Step
Compile and Execute a Jdk Preview Feature with Maven
Java.Lang.Verifyerror: Expecting a Stackmap Frame at Branch Target Jdk 1.7
Converting a Jfreechart Timeseries Series with Day Data to Week or Month Data
What Determines Kafka Consumer Offset
Deciphering Variable Information While Debugging Java
Is It Better Practice to Use String.Format Over String Concatenation in Java
Enhanced 'For' Loop Causes an Arrayindexoutofboundsexception
Why Can't We Use '==' to Compare Two Float or Double Numbers
How and Where to Use Static Modifier in Java
Java - How to Receive Point Coordinates After Mouse Button Release (Jfreechart)