从散列映射中删除给定值的所有项

所以我有一个如下所示的java hashmap:

hMap.put("1", "One"); hMap.put("2", "Two"); hMap.put("3", "Two"); 

我想删除值为“Two”的所有项目

如果我这样做:

 hmap.values().remove("Two"); 

只删除了第一个,我想将它们全部删除,怎么办呢?

hmap.values().removeAll(Collections.singleton("Two"));

编辑:这个简洁方法的(显着)缺点是你基本上被迫评论它,说类似的东西

// remove("Two") would only remove the first one

否则,一些善意的工程师会在某一天尝试为你简化并打破它。 这种情况发生了…有时候善意的做法甚至是未来你!

在Java 8中

 hmap.values().removeIf(val -> "Two".equals(val)); 
 for (Iterator> it = hMap.entrySet().iterator(); it.hasNext();) { Map.Entry e = it.next(); if ("Two".equals(e.getValue())) { it.remove(); } } 

你可以使用while( hmap.values().remove("Two") ); 因为如果由于调用而更改了集合,则remove调用返回true

(更新了已删除值的记录解决方案)

此解决方案使用google-collections库[ LINK ]

 import static com.google.common.collect.Maps.filterValues; import static com.google.common.base.Predicates.equalTo; ... Map 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库,但如果不这样做,我建议您查看它。

您必须遍历列表,查看值对象,并有条件地执行删除操作。 请注意,如果在迭代HashMap时尝试删除对象,则会出现exception。 必须制作地图的副本或使用ConcurrentHashMap