如何在迭代时从 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 中删除键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章