Java 迭代/更新HashMap

Java 迭代/更新HashMap,java,map,iterator,hashmap,hashset,Java,Map,Iterator,Hashmap,Hashset,我知道迭代hashmap有几种方法,但在进行过程中修改hashmap的好方法是什么(除了创建新的hashmap并去掉旧的hashmap之外) 我想要像这样的东西 for (Map.Entry<String, Integer> entry : wordcounts.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); if(blacklist.contains(k

我知道迭代hashmap有几种方法,但在进行过程中修改hashmap的好方法是什么(除了创建新的hashmap并去掉旧的hashmap之外)

我想要像这样的东西

for (Map.Entry<String, Integer> entry : wordcounts.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    if(blacklist.contains(key))
        //remove key/value for that key from wordcounts
    if(mappings.contains(key))
     //change key in wordcounts from one string to another based on the key's value in a <string,string> map (mappings)
}
for(Map.Entry:wordcounts.entrySet()){
String key=entry.getKey();
整数值=entry.getValue();
if(黑名单包含(键))
//从字数中删除该键的键/值
if(mappings.contains(key))
//根据映射(映射)中键的值,将单词计数中的键从一个字符串更改为另一个字符串
}

在浏览地图时,我是否可能修改地图?是否必须使用迭代器?

用于更改映射的值。如果要删除映射,请使用
setValue(null)
使用
迭代器

利用映射:首先查看其他集合并执行操作

for(String blacklisted : blacklist) {
    wordcounts.remove(blacklisted);
}
for(String mapping : mappings) {
    String oldKey =    // get old key
    String value = wordcounts.get(oldKey);
    wordcounts.remove(oldKey);
    wordcounts.put(mapping, value);
}

不要试图在迭代过程中删除项,否则会从迭代器中得到异常。最好的选择是

a) 通过迭代/复制到新地图或 b) 跟踪要删除的项目,并在完成迭代后删除它们

如果你在换钥匙,同样的事情也适用。。继续跟踪,并在完成迭代后执行删除/添加


如果您只是在更改值,那么就去做。

您可以使用
迭代器来删除遇到的条目。更改键值需要创建一个新的
映射
,或者复制不变的值,或者修改并插入变化的值。如果在添加到新地图时将它们从旧的
地图中删除,时间和内存成本不会太大。公平地说,我将在一个小地图上进行这些特殊的修改,这样创建新地图可能会更简单map@LeeMeador我确实详细地看了这篇文章,虽然它指定了如何删除元素,而不是修改键,但是如果我只是创建一个新的映射,我想这不是一个问题。我可能最终需要使用迭代器删除某个长度以下的单词。再想想,使用
setValue(null)
可能不会删除映射。我将对此进行测试并返回给您。是的,查看javadocs看起来可能只是将值设置为null(尽管我认为有一个map.remove(key)选项)@Lemonio是的,
setValue(null)
只是将映射设置为
null
。如果你尝试在迭代时使用
Map.remove(key)
,你会得到一个
ConcurrentModificaitonException
。是的,这是我从其他线程中所想的,但是vakh的删除建议似乎是一个很好的方法。第一部分是智能的,确实让事情变得更快。第二,put是否修改了它们的键或值?因为我想修改第二张地图的关键点:你可以删除它,然后重新添加修改后的。好的一点,考虑到我处理的是一张小地图,成本可能不会太高