以有效的方式从地图上删除多个键?


124

我有Map<String,String>大量的键值对。现在,我要从中删除选定的键Map。以下代码显示了我为实现该目的所做的工作。

Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 

然后 :

Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
   map.remove( entriesIterator.next().toString());
} 

可以了 我只想知道,哪种方法可以更好地满足我的要求?

Answers:


241

假设你的一套包含您要删除的字符串,你可以使用keySet方法map.keySet().removeAll(keySet);

keySet返回此映射中包含的键的Set视图。该集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。

人为的例子:

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"

你的建议很棒。我猜removeAll(keySet)正在做我在那里做的事情
Ruchira Gayan Ranaweera

11
就“效率”而言,可能只是下面的for循环,但
就更简洁的

3

仅出于完整性考虑:

正如猜测的那样,java.util.AbstractSet#removeAll实际上遍历所有条目,但是有一个小技巧:它使用较小集合的迭代器:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.