本意是想删除记录中value小于 20的记录,且看代码
import java.util.*;public class TestHashMap { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> staff = new HashMap<String, Integer>();
staff.put("qqq", 22);
staff.put("www", 20);
staff.put("aaa", 15);
staff.put("sss", 12);

System.out.println("Before:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {
System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
}
System.out.println();                  for ( Map.Entry<String, Integer> e : staff.entrySet()) {
String str = e.getKey();
double value = staff.get(str);
if (value < 20) {
staff.remove(str);
}
}
                  
                  System.out.println("After:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {

System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
} }}出现如下错误信息:
Before:
 <qqq--22>  <aaa--15>  <sss--12>  <www--20> 
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$EntryIterator.next(HashMap.java:834)
at java.util.HashMap$EntryIterator.next(HashMap.java:832)
at org.guet.collection.TestHashMap.main(TestHashMap.java:26) 而只删除其中一条记录 如<sss  12> 用staff.remove("sss");确实可以的。 这是为什么? 哪位大侠帮忙解释一下。谢谢!

解决方案 »

  1.   

    不能在 遍历 map的时候 删除 楼主
      

  2.   

    那我要将HashMap中value小于12的记录全部删除,如何实现?除了,将value大于20的记录取出来放到另外一个HashMap中。 还有其他的方法吗? 谢谢!
      

  3.   

    把 staff 的声明改成这样之后再试试看:Map<String, Integer> staff = new ConcurrentHashMap<String, Integer>();ConcurrentHashMap 为 java.util.concurrent.ConcurrentHashMap
      

  4.   

    把后面的foreach改为for循环试下
      

  5.   

    问题已经解决,多谢各位关注!下面的代码实现了三种方法。至于这三种方法的效率,我不清楚,大家来评定一下喽。
    import java.util.*;
    import java.util.concurrent.ConcurrentHashMap;public class TestHashMap { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashMap<String, Integer> staff = new HashMap<String, Integer>();
    //     Map<String, Integer> staff = new ConcurrentHashMap<String, Integer>();
    staff.put("qqq", 22);
    staff.put("www", 20);
    staff.put("aaa", 2);
    staff.put("sss", 2);

    System.out.println("Before:");
    for ( Map.Entry<String, Integer> e : staff.entrySet()) {
    System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
    }
    System.out.println();

    Set<Map.Entry<String,Integer>> entrys = staff.entrySet();   
     for(Iterator i = entrys.iterator();i.hasNext();) {   
                Map.Entry entry = (Map.Entry)i.next();   
                if((Integer)entry.getValue()< 20) {   
                    i.remove();   
                }   
            }  
     
     /**
      * 另外一种方法
      * */
     /*Set<String> keys=staff.keySet();
    List<String> l=new ArrayList<String>();
    for(Iterator<String> it=keys.iterator();it.hasNext();){
    String key=it.next();
    if(staff.get(key)<20){
    l.add(key);
    }
    }
    for(String s:l){
    staff.remove(s);
    }*/

    System.out.println("After:");
    for ( Map.Entry<String, Integer> e : staff.entrySet()) {

    System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
    } }}