【问题标题】:Remove one value in hashmap instead of all values and key删除 hashmap 中的一个值,而不是所有值和键
【发布时间】:2021-01-28 04:00:00
【问题描述】:

我有一个哈希图,它是 Map<String, Set<String>> tasks 。在任务中,我有一些键,键有一些值,而不仅仅是一个值。

我想用给定的键从 hashmap 中删除一个值,但我也想在那里保留其他值。

我的意思是像这样 release = ["fix bug 1", "fix bugs 2" , "implement feature X"] 。现在release 是键(在字符串类型中)并且具有值(在集合类型中)"fix bug 1", "fix bugs 2" , "implement feature X" .. 我想像这样修改 release

release = ["implement feature X"]

如何删除 2 个值???谢谢

【问题讨论】:

  • 您需要获取Set<String>,然后像任何其他集合一样从中删除。 Map 对你正在做的事情并不重要。
  • 但是当我从Set<String> 中删除值时,我必须更新hashMap,对吗? @LouisWasserman
  • 我收到了ConcurrentModificationException 异常
  • 没有。您不应该更新地图。如果你得到ConcurrentModificationException,那么你从集合中删除值的代码是错误的,可能是因为你在循环中调用set.remove(value)而不是使用Iterator.remove(),或者使用removeIfremoveAll不在循环中。

标签: java hashmap


【解决方案1】:

使用key可以得到你想要的Set,然后删除值:

map.get("key").removeIf(s -> s.equals("value"));
map.get("key").removeIf(s -> s.equals("value") || s.equals("value1"));

你可以做更多的组合。 不需要更新HashMap。它有 Set 的引用,无论发生什么 Set HashMap 都知道。

【讨论】:

  • 当然removeIf(s -> s.equals("value"))remove("value")是一样的。
【解决方案2】:

您的地图仅包含对集合的引用,因此您可以直接修改集合,并且地图将看到更改。

这意味着你可以做到:

tasks.get("release").removeAll(Arrays.asList("fix bug 1", "fix bug 2"));

甚至:

tasks.get("release").retainAll(Arrays.asList("implement feature X"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多