【问题标题】:How to update a value for a key in HashMap?如何更新 HashMap 中键的值?
【发布时间】:2012-09-26 07:14:07
【问题描述】:

我有这样的 HashMap,

HashMap<String,Set<String>> map = new HashMap<String,Set<String>>();

我正在尝试在map中添加元素之前做,

  1. 想查看key是否存在,可以通过map.containsKey()获取。
  2. 如果密钥存在,我想检查Set 对应于该密钥的大小。
  3. 如果size &lt;= 1 我想在该集合中添加一个元素。

【问题讨论】:

  • if (map.containsKey("x")) {Set&lt;String&gt; s = map.get("x"); if (s.size() &lt;= 1) { s.add("y");}}(哦,只是误读了应该更新密钥 - 为什么?!)
  • 为什么要更新密钥?你不能也不应该考虑这样做

标签: java collections hashmap


【解决方案1】:

我不会使用 containsKey 和 get,因为这意味着当您只需要一个时会进行两次查找。

private final Map<String,Set<String>> map = new HashMap<String,Set<String>>();

Set<String> set = map.get(key);
if(set != null && set.size() <= 1) 
    set.add(some$value);

唯一的问题是该值将始终为null,除非您将其设置在某个地方,因此您可能想要的是

private final Map<String,Set<String>> map = new HashMap<String,Set<String>>();

Set<String> set = map.get(key);
if(value != null)
    map.put(key, set = new HashSet<String>());
if (set.size() <= 1) 
    set.add(some$value);

最大大小为 2 的集合是不寻常的。这有什么原因吗?

【讨论】:

  • 我只想为一个键存储 2 个值...所以我设置了最大大小为 2。
【解决方案2】:

听起来像这样:

HashMap<String,Set<String>> map = new HashMap<String,Set<String>>();

Set<String> value = map.get("key");
if(value != null) {        
    if(value.size() <= 1) {
        value.add("some value");
    }
} else {
    map.put("key", new HashSet<String>());
}

现在,要么最后一点措辞不当(即你想更新与密钥关联的 Set),要么你真的想更新密钥本身,在这种情况下你可能只需要删除它并添加一个新条目。

【讨论】:

  • 我知道 OP 要求它,但如果将 value.size() 与 0 进行比较会更有意义。但无论如何都要赞成 ;)
  • @David Grant:你的意思是== 0而不是&lt;= 1
  • @David Grant:不知道他到底想在这里做什么。如果大小是 0 或 1,他可能想添加一些东西。我只是留下了他的原始代码。
  • 它会改进一些东西到map.get(key)然后检查null,因为我猜如果没有这样的键应该添加,对吧?
  • @Fildor:是的,我想它会更有效,因为只完成了一次查找。
【解决方案3】:

您可以使用 map.get(String key) 从地图中获取集合。

然后测试Set的大小。如果需要,请添加您的元素。

现在您可以简单地使用 map.remove(String key) 从地图中删除旧集,然后使用 put(String, Set); 重新插入它

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2021-04-11
    • 2016-02-07
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多