如何在迭代时从 HashMap 中删除键? [复制]

Posted

技术标签:

【中文标题】如何在迭代时从 HashMap 中删除键? [复制]【英文标题】:How to remove a key from HashMap while iterating over it? [duplicate] 【发布时间】:2011-08-30 20:41:22 【问题描述】:

我将HashMap 称为testMap,其中包含String, String

HashMap<String, String> testMap = new HashMap<String, String>();

在迭代map时,如果value与指定的字符串匹配,我需要从map中移除key。

for(Map.Entry<String, String> entry : testMap.entrySet()) 
  if(entry.getValue().equalsIgnoreCase("Sample")) 
    testMap.remove(entry.getKey());
  

testMap 包含"Sample",但我无法从HashMap 中删除密钥。 反而得到错误:

"Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)"

【问题讨论】:

请始终复制/粘贴代码 sn-ps,而不是键入“类似于”使用的代码。显示的原始代码无法引发运行时异常,因为它是不可编译的。 另一个选项虽然很笨拙,但在迭代时创建要删除的对象列表。然后,您可以在初始循环之后创建另一个循环,该循环遍历该列表并将它们从哈希图中删除。 【参考方案1】:

试试:

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();
    

使用 Java 1.8 及更高版本,您只需一行即可完成上述操作:

testMap.entrySet().removeIf(entry -> "Sample".equalsIgnoreCase(entry.getValue()));

【讨论】:

如果你想删除一个不是你的迭代器所在的项目怎么办? @HDave 可以使用Map.remove (Object key) 之类的方法,但不应该在迭代期间进行。如果在迭代期间使用除Iterator.remove() 之外的任何删除方法,则迭代的结果是不确定的。要么等到迭代器“打开”要删除的条目并使用Iterator.remove(),要么在迭代循环之外(之前/之后)执行此操作。如果是后者,请确保在对映射进行任何迭代之前从条目集中获取新的迭代器,因为任何先前的迭代器都会产生未定义的结果。 或者你可以使用类似语义的for循环,见***.com/a/1884916/32453 很多年前我在 Java 8 之前就遇到过这个问题,我使用 ConcurrentHashMap 而不是 HashMap。【参考方案2】:

要从 hashmap 中删除特定的键和元素,请使用

hashmap.remove(key)

完整的源代码就像

import java.util.HashMap;
public class RemoveMapping 
     public static void main(String a[])
        HashMap hashMap = new HashMap();
        hashMap.put(1, "One");
        hashMap.put(2, "Two");
        hashMap.put(3, "Three");
        System.out.println("Original HashMap : "+hashMap);
        hashMap.remove(3);   
        System.out.println("Changed HashMap : "+hashMap);        
    

来源:http://www.tutorialdata.com/examples/java/collection-framework/hashmap/remove-mapping-of-specified--key-from-hashmap

【讨论】:

您没有阅读整个问题【参考方案3】:

使用Iterator.remove().

【讨论】:

以上是关于如何在迭代时从 HashMap 中删除键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在迭代时从地图中删除?

Python:如何在迭代列表时从列表中删除元素而不跳过未来的迭代

迭代Java时从数组中删除对象

迭代时从 HashSet 中删除元素 [重复]

Qt在迭代时从QMultiHash中删除项目

在Java中遍历HashMap时如何确保键的顺序不能改变? [复制]