Removing all items of a given value from a hashmap

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-18 03:09:32

问题


So I have a java hashmap like below:

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

I would like to remove ALL items where the value is "Two"

If I do something like:

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

Only the first one is deleted, I want to remove them all, how can this be done?


回答1:


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

EDIT: the (significant) disadvantage with this concise approach is that you are basically forced to comment it, saying something like

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

otherwise, some well-meaning engineer will try to simplify it for you someday and break it. This happens... sometimes the well-intentioned do-gooder is even Future You!




回答2:


In Java 8

hmap.values().removeIf(val -> "Two".equals(val));



回答3:


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();
 }
}




回答4:


You can use while( hmap.values().remove("Two") ); since the remove call returns true if the collection was changed as a result of the call.




回答5:


(Updated solution for logging of removed values)

This solution uses the google-collections library [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.

Note - This solution takes advantage of the fact that the Map returned by the filterValues call is a view of the elements in the original HashMap. This allows us to examine them and log out the keys that were removed, and then remove them from the original map with a simple call to clear().

You may have reasons for not wanting to use the google-collections library in your project, but if you don't, I'd suggest checking it out.




回答6:


You have to iterate through the list, look at the value object, and conditionally do the remove. Note you'll get an exception if you try to remove an object while iterating over a HashMap. Would have to make a copy of the map or use ConcurrentHashMap.



来源:https://stackoverflow.com/questions/2594059/removing-all-items-of-a-given-value-from-a-hashmap

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!