所以我有一个如下所示的java hashmap:
hMap.put("1", "One");
hMap.put("2", "Two");
hMap.put("3", "Two");
我想删除值为“Two”的所有项目
如果我这样做:
hmap.values().remove("Two");
只删除了第一个,我想将它们全部删除,怎么办呢?
答案 0 :(得分:44)
hmap.values().removeAll(Collections.singleton("Two"));
编辑:这种简洁方法的(显着)缺点是你基本上被迫发表评论,说像
// remove("Two") would only remove the first one
否则,一些好心的工程师会在某一天尝试为你简化并打破它。这种情况发生了......有时好心的做事甚至是未来你!
答案 1 :(得分:22)
In Java 8
hmap.values().removeIf(val -> "Two".equals(val));
答案 2 :(得分:15)
for (Iterator<Map.Entry<String,String>> it = hMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<String,String> e = it.next();
if ("Two".equals(e.getValue())) {
it.remove();
}
}
答案 3 :(得分:10)
您可以使用while( hmap.values().remove("Two") );
,因为如果通过调用更改了集合,则删除调用将返回true
。
答案 4 :(得分:6)
(用于记录已删除值的更新解决方案)
此解决方案使用google-collections库[LINK]
import static com.google.common.collect.Maps.filterValues;
import static com.google.common.base.Predicates.equalTo;
...
Map<String, String> removedValues = filterValues(hMap, equalTo("Two"));
System.out.println(removedValues); //Log Removed Values
removedValues.clear(); //Removes from original map, since this is a view.
注意 - 此解决方案利用了filterValues调用返回的Map是原始HashMap中元素的视图这一事实。这允许我们检查它们并注销已删除的键,然后通过简单的clear()调用将它们从原始地图中删除。
您可能有理由不想在项目中使用google-collections库,但如果不这样做,我建议您查看它。
答案 5 :(得分:2)
您必须遍历列表,查看值对象,并有条件地执行删除操作。请注意,如果在迭代HashMap
时尝试删除对象,则会出现异常。必须制作地图副本或使用ConcurrentHashMap
。