标题问题很好地概括了它,但假设我使用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值条目从来没有出现过!
我有什么方法可以有效地做到这一点?
答案 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);