从HashMap中删除所有值,而不是我正在寻找的值

时间:2017-05-18 07:20:17

标签: java hashmap

标题问题很好地概括了它,但假设我使用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的条目,所以我想尽可能有效地删除它们 所有 ,只留下条目值为1或3。

看起来好像我的地图是这样的:

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

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

好像我的2值条目从来没有出现过!

我有什么方法可以有效地做到这一点?

3 个答案:

答案 0 :(得分:8)

map.entrySet().removeIf(entry -> entry.getValue() == 2)

答案 1 :(得分:1)

使用帮助地图

如果你想尽可能有效地做,你可以创建一个倒置的地图:

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

使用其他东西

另一个选择是寻找支持双向搜索和删除的专用集合类。查看这些讨论的可能潜在客户:

答案 2 :(得分:0)

使用guava你可以这样做:

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