Iterating through/Updating HashMap
我知道有几种方法可以迭代散列图,但是在进行过程中修改散列图的好方法是什么(除了创建新的散列图和去掉旧的散列图之外)
我想要类似的东西
1 2 3 4 5 6 7 8
| 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)
} |
我在看地图的时候可能会修改它吗?我必须使用迭代器吗?
- 当您遇到条目时,可以使用Iterator删除它们。更改键值需要创建一个新的Map,并复制不变的值或修改和插入更改的值。如果在添加到新的Map中时将它们从旧的Map中删除,那么时间和内存的成本就不会太大。
- 很公平,我将在一个小地图上做这些特殊的修改,这样创建一个新地图就更简单了
- @Leemeador我确实仔细看了帖子,虽然它指定了如何删除元素,而不是修改键,但是如果我只是创建一个新的地图,我想这不是问题。
- 我可能最终需要使用迭代器删除某个长度以下的单词
利用地图:先浏览其他收藏,然后进行操作。
1 2 3 4 5 6 7 8 9
| 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 );
} |
- 第一部分是聪明,确实让事情变得更快。对于第二个,put是否修改它们的键或值?因为我想修改密钥
- 对于第二个:您可以删除它,然后将其添加回修改状态。
- 好的,考虑到我正在处理一个小地图,成本可能不会太低。
- 我编辑了我的答案:)
使用Map.Entry.setValue更改映射的值。如果要删除映射,use setValue(null)use an Iterator。
- 第二种想法是,使用setValue(null)可能不会删除映射。我来测试一下,然后给你回电。
- 是的,通过javadocs查看,可能只是将值设置为空。
- (尽管我认为有一个map.remove(key)选项)
- @是的,setValue(null)只是设置到null的映射。如果您试图在迭代时使用Map.remove(key),您将得到一个ConcurrentModificaitonException。
- 是的,这就是我从其他方面想的,但是瓦赫的建议似乎是一个很好的方法。
不要在迭代过程中尝试移除项,否则会从迭代器中得到异常。最好的办法是
a)通过迭代/复制到新的映射或b)跟踪要删除的项,并在迭代完成后删除它们。
如果你在换钥匙,同样的事情也适用。继续跟踪,并在迭代完成后执行删除/添加操作。
如果你只是在改变价值观,那就去做吧。