如何从HashMap中删除密钥?

时间:2015-10-01 00:08:49

标签: java hashmap

我有这个hashmap

HashMap <Integer,Integer> H = new HashMap <Integer,Integer>();

当我尝试从HashMap中删除密钥时,我发现了这个错误

**Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
at java.util.HashMap$KeyIterator.next(HashMap.java:956)
at Livre.montantTotal(Livre.java:42)** 

这是我的代码

for (int e : H.keySet()){
    H.put(e, H.get(e)-1);
    if (H.get(e) == 0){
        H.remove(e);
    }
}   

3 个答案:

答案 0 :(得分:3)

在迭代时,您需要使用Iterator从集合中删除。

for (Iterator<Map.Entry<Integer, Integer>> i = H.entrySet().iterator(); i.hasNext();) {
    Map.Entry<Integer, Integer> e = i.next();
    int v = e.getValue();
    if (v == 1)
        i.remove();
    else
        e.setValue(v - 1);
}

来自HashMap.EntrySet()https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

的文档
  

该集由地图支持,因此对地图的更改将反映在中   集合,反之亦然。

答案 1 :(得分:3)

您收到此错误是因为您尝试删除该元素并重新排列其已经在使用中的hashmap(同时循环遍历它)。

要循环使用Java中的集合对象,您可以使用Iterator类来解决问题。该类使用remove()方法从HashMap中删除密钥对。

How to remove a key from HashMap while iterating over it?
的可能重复 iterating over and removing from a map

修改

在Java 7及更早版本上试用此代码:

Map<String, String> map = new HashMap<String, String>() {
  {
    put("test", "test123");
    put("test2", "test456");
  }
};

for(Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); ) {
  Map.Entry<String, String> entry = it.next();
  if(entry.getKey().equals("test")) {
    it.remove();
  }
}

在Java 8中,您可以尝试:

map.entrySet().removeIf(e-> <boolean expression> );

答案 2 :(得分:0)

在您重复浏览时,您无法改变某些内容。当您更改HashMap时,您也会更改它keySet,并且由于您正在迭代它,因此Java会抛出错误。您可能需要做的是将需要删除的每个键添加到单独的列表中,然后再遍历该列表。

像这样:

ArrayList<Integer> otherList = new ArrayList<>();
for(int e : H.keySet()){
    h.put(e, H.get(e) - 1);
    if(H.get(e) == 0)
        otherList.add(e);
}

for(int e : otherList){
    H.remove(e);
}