Wednesday, September 28, 2011

Removing entries from a HashMap in an elegant way

HashMap


There are a few solutions for looping a HashMap, but one of the most elegant looks like below:
 
 
01.HashMap<String, Integer> map = new HashMap<String, Integer>();
02.  map.put("One", 1);
03.  map.put("Two", 2);
04.  map.put("Three", 3);
05.  map.put("Four", 4);
06.  map.put("Five", 5);
07.  map.put("Six", 6);
08.  map.put("Seven", 7);
09.  map.put("Eight", 8);
10.  map.put("Nine", 9);
11.  map.put("Ten", 10);
12.          
13.  for (Map.Entry<String, Integer> entry : map.entrySet()) {
14.       System.out.println(map.getKey() + "    " + map.getValue());      
15.  }
 
 
Now, that is great, but if you try to remove an entry while looping
 
 
1.  for (Map.Entry<String, Integer> entry : map.entrySet()) {
2.     if(entry.getValue() > 5){
3.        map.remove(entry.getKey());
4.      }
5.}


an java.util.ConcurrentModificationException will occur!
Solving this issue involves adding an Iterator which conforming to documentation “Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.” will allows us to call remove(). Therefore, here it is:
 
 
1.for(Iterator<Map.Entry<String,Integer>>it=map.entrySet().iterator();it.hasNext();){
2.     Map.Entry<String, Integer> entry = it.next();
3.     if (entry.getValue() > 5) {
4.          it.remove();
5.     }
6. }
 
 
Done !

Reference

No comments:

Post a Comment