【问题标题】:Iterating through/Updating HashMap [duplicate]迭代/更新HashMap [重复]
【发布时间】:2013-07-06 03:01:34
【问题描述】:

我知道有几种方法可以遍历 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)
}

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

【问题讨论】:

  • 您使用Iterator 删除您遇到的条目。更改键值将需要创建一个新的 Map 并复制未更改的值或修改并插入更改的值。如果您在添加到新Map 时将它们从旧Map 中删除,则时间和内存成本不会太大。
  • 很公平,我将在一张小地图上进行这些特殊修改,这样创建新地图可能会更简单
  • @LeeMeador 我确实详细查看了帖子,虽然它指定了如何删除元素,而不是修改键,但如果我只是创建一个新地图,我想这不是问题
  • 我可能最终需要使用迭代器来删除低于一定长度的单词

标签: java map iterator hashmap hashset


【解决方案1】:

利用地图:首先浏览您的其他收藏并进行操作。

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 修改它们的键或值?因为我想修改密钥
  • 对于第二个:您可以将其删除,然后将其重新添加修改。
  • 好点,考虑到我正在处理一张小地图,成本可能不会太差
【解决方案2】:

不要在迭代期间尝试删除项目,否则迭代器会出现异常。最好的选择是任一

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

如果您要更改键,同样的事情也适用.. 保持跟踪,并在完成迭代后执行删除/添加。

如果你只是改变价值观,那就去做吧。

【讨论】:

    【解决方案3】:

    使用Map.Entry.setValue 更改映射的值。如果你想删除映射,使用setValue(null)使用Iterator

    【讨论】:

    • 再想一想,使用setValue(null) 可能不会删除映射。我会对此进行测试并回复您。
    • 是的,通过 javadocs 看起来它可能只是将值设置为 null
    • (虽然我认为有一个 map.remove(key) 选项)
    • @Lemonio 是的,setValue(null) 只是将映射设置为null。如果您尝试在迭代时使用Map.remove(key),您将得到ConcurrentModificaitonException
    • 是的,这就是我从其他线程中的想法,但 vakh 的删除建议似乎是个好方法
    猜你喜欢
    • 1970-01-01
    • 2013-09-29
    • 2016-02-23
    • 2016-01-30
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2014-06-14
    相关资源
    最近更新 更多