【问题标题】:Remove all entries from HashMap where value is NOT what I'm looking for从 HashMap 中删除所有值不是我要查找的条目
【发布时间】:2017-05-18 07:20:16
【问题描述】:

标题问题很好地总结了它,但假设我正在使用 Java 编码并且有一个看起来像这样的HashMap(显然它有更多条目):

Map<String, Integer> myMap = new HashMap<>();

myMap.put{"a", 1}
myMap.put{"b", 2}
myMap.put{"c", 2}
myMap.put{"d", 3}

现在我不喜欢值为 2 的条目,所以我想尽可能有效地删除它们all,只留下具有值 1 或 3。

它应该看起来好像我的地图是这样制作的:

Map<String, Integer> myMap = new HashMap<>();

myMap.put{"a", 1}
myMap.put{"d", 3}

好像我的 2 值条目根本不存在!

我有哪些选择可以有效地做到这一点?

【问题讨论】:

标签: java hashmap


【解决方案1】:
map.entrySet().removeIf(entry -> entry.getValue() == 2)

【讨论】:

  • 做到了!我不得不选择map.entrySet().removeIf(e -&gt; (int) ((Entry) e).getValue() == 2),但原理是一样的。
【解决方案2】:

使用辅助地图

如果您想尽可能有效地做到这一点,您可以创建一个倒置地图:

HashMap<Integer, List<String>> affectedKeysMap = new HashMap<>();

您需要手动跟踪两个地图的所有更新,以使它们保持同步。

这将允许您以有效的方式查找和删除受影响的密钥:

int valueToRemove = 2;
for(String affectedKey : affectedKeysMap.get(2)) {
    map.remove(affectedKey);
}
affectedKeysMap.remove(valueToRemove);

使用单一地图

使用单个HashMap,您所能做的就是遍历整个条目集,因为HashMap 不支持按值快速搜索。

这个问题已经用一张地图涵盖了不同的方法:Removing all items of a given value from a hashmap

用别的东西

另一种选择是寻找支持双向搜索和删除的专用集合类。查看这些讨论以了解可能的线索:

【讨论】:

  • 很好的答案,但遗憾的是不是第一个答案。不过,这给了我很多阅读量,所以给你一个多汁的投票!
【解决方案3】:

使用guava 你可以这样做:

Integer valueToDrop = Integer.valueOf(2);
Predicate<Integer> predicate = Predicates.not(Predicates.equalTo(valueToDrop));
Map<String, Integer> filteredMap = Maps.filterValues(myMap, predicate);

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2021-01-28
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    相关资源
    最近更新 更多