Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove multiple keys from Map in efficient way?

People also ask

How do I remove all values from a map?

HashMap. clear() method in Java is used to clear and remove all of the elements or mappings from a specified HashMap. Parameters: The method does not accept any parameters. Return Value: The method does not return any value.

Can 2 keys have same value in map?

However, none of the existing Java core Map implementations allow a Map to handle multiple values for a single key. As we can see, if we try to insert two values for the same key, the second value will be stored, while the first one will be dropped.


Assuming your set contains the strings you want to remove, you can use the keySet method and map.keySet().removeAll(keySet);.

keySet returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa.

Contrived example:

Map<String, String> map = new HashMap<>();
map.put("a", "");
map.put("b", "");
map.put("c", "");

Set<String> set = new HashSet<> ();
set.add("a");
set.add("b");

map.keySet().removeAll(set);

System.out.println(map); //only contains "c"

For the sake of completion, and since Google brings you here when you look for a way to achieve this:

map.entrySet().removeIf(entry -> /* decide what you want to remove here */ );

This does not assume you have a predefined set of keys to remove but rather assumes you have a condition on which the keys should be removed. From the question, it is unclear if these keys are added manually or based on some sort of condition. In the latter case, this might be the cleaner code.

For the former case, this (untested) code might work as well:

map.entrySet().removeIf(entry -> keySet.contains(entry.getKey()) );

But obviously the answer provided by @assylias is much cleaner in this case!


Just for the sake of completeness:

As guessed java.util.AbstractSet#removeAll really iterates over all entries, but with one little trick: It uses the iterator of the smaller collection:

if (size() <= collection.size()) {
    Iterator<?> it = iterator();
    while (it.hasNext()) {
        if (collection.contains(it.next())) {
            it.remove();
        }
    }
} else {
    Iterator<?> it = collection.iterator();
    while (it.hasNext()) {
        remove(it.next());
    }
}

Using Java stream:

keySet.forEach(map::remove);