如何在迭代时从HashMap中删除一个键?

ssb*_*cse 149 java dictionary

我正在HashMap调用testMap哪个包含String, String.

HashMap<String, String> testMap = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)

迭代地图时,if value与指定的字符串匹配,我需要从地图中删除该键.

for(Map.Entry<String, String> entry : testMap.entrySet()) {
  if(entry.getValue().equalsIgnoreCase("Sample")) {
    testMap.remove(entry.getKey());
  }
}
Run Code Online (Sandbox Code Playgroud)

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)"
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 309

尝试:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

testMap.entrySet().removeIf(entry -> "Sample".equalsIgnoreCase(entry.getValue()));
Run Code Online (Sandbox Code Playgroud)

  • @HDave可以使用像`Map.remove(Object key)`之类的方法,但不应该在迭代期间完成.如果在迭代期间使用除"Iterator.remove()"之外的任何remove方法,则迭代的结果是未定义的.要等到迭代器"打开"你要删除的条目并使用`Iterator.remove()`,要么在迭代循环之外(之前/之后)执行.如果是后者,请确保在对映射执行任何迭代之前从条目集中获取新的迭代器,因为任何先前的迭代器都将产生未定义的结果. (7认同)
  • 如果要删除不是迭代器所在的项目,该怎么办? (3认同)
  • 或者您可以使用具有类似语义的“for”循环,请参阅http://stackoverflow.com/a/1884916/32453 (2认同)

Pri*_*ley 15

使用Iterator.remove().

  • 这个答案可以提供更多细节. (5认同)