【问题标题】:How to delete all record having frequency 1 in HashMap in one Pass? [duplicate]如何一次性删除HashMap中频率为1的所有记录? [复制]
【发布时间】:2020-10-28 20:25:05
【问题描述】:

我想删除频率为 1 的键,但出现以下错误

Exception in thread "main" java.util.ConcurrentModificationExceptionat java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1495)
at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1518)
at Temp3.main(Temp3.java:14) 

如何解决?

import java.io.*;
import java.util.HashMap;
import java.util.*;

public class Temp3 {

    public static void main(String[] args) {
         Map<Integer, Integer> map = new HashMap();
         map.put(1,1);
         map.put(2,1);
         map.put(3,1);
         map.put(4,2);

         for(int k: map.keySet()){
             if( map.get(k) == 1){
                 map.remove(k);
             }
          }
    }
}

【问题讨论】:

  • 当你在地图上迭代时,你不能修改它,否则你会得到一个ConcurrentModificationException。使用支持删除的Iterator,或者临时复制要删除的元素到新的数据结构中,然后再删除。
  • 这能回答你的问题吗? iterating over and removing from a map

标签: java dictionary collections hashmap


【解决方案1】:

您可以使用Collection.removeIf()Map.values() 方法:

map.values().removeIf(i -> i.equals(1));

从地图中删除所有等于1的元素。

【讨论】:

    【解决方案2】:

    问题是您在迭代地图时正在修改它。 可能的解决方案:

    import java.io.*;
    import java.util.HashMap;
    import java.util.*;
    
    public class Temp3 {
    
        public static void main(String[] args) {
             Map<Integer, Integer> map = new HashMap();
             map.put(1,1);
             map.put(2,1);
             map.put(3,1);
             map.put(4,2);
             Integer key = null;
             for(int k: map.keySet()){
                 if( map.get(k) == 1){
                     key == k;
                     break;
                 }
              }
             map.remove(key);
        }
    }
    

    或者只是

    import java.io.*;
    import java.util.HashMap;
    import java.util.*;
    
    public class Temp3 {
    
        public static void main(String[] args) {
             Map<Integer, Integer> map = new HashMap();
             map.put(1,1);
             map.put(2,1);
             map.put(3,1);
             map.put(4,2);
    
             map.remove((Integer)1);
        }
    }
    

    【讨论】:

    • map.Remove((Integer)1) 给出错误提示“找不到符号”
    • 对不起,我用大写字母表示“删除”。我正在编辑答案
    • 我想删除频率为 1 的所有键,您的解决方案将只删除一条记录
    • 什么意思?给定键只能有一条记录
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2020-03-10
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多