Java 以有效的方式从地图中删除多个关键点?

Java 以有效的方式从地图中删除多个关键点?,java,dictionary,Java,Dictionary,我有一个带有大量键值对的映射。现在,我想从贴图中删除选定的关键点。下面的代码显示了我是如何实现这一点的 Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 然后: Iterator entriesIterator = keySet.iterator(); while (entriesIterator.hasNext()) { map.remove( entriesIterator.ne

我有一个带有大量键值对的
映射。现在,我想从
贴图中删除选定的关键点。下面的代码显示了我是如何实现这一点的

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

这很好用。更好的方法是什么?

假设您的集合包含要删除的字符串,您可以使用和
map.keySet().removeAll(keySet)

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

人为的例子:

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"
Map Map=newhashmap();
放在地图上(“a”和“);
地图.放置(“b”和“);
放在地图上(“c”和“);
Set=newhashset();
集合。添加(“a”);
设置。添加(“b”);
map.keySet().removeAll(set);
系统输出打印项次(map)//仅包含“c”

为了完整起见:

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

if(size()it=collection.iterator();
while(it.hasNext()){
移除(it.next());
}
}
使用Java流:

keySet.forEach(map::remove);

为了完成这项任务,既然谷歌在你寻找实现这一目标的方法时把你带到了这里:

map.entrySet().removeIf(entry -> /* decide what you want to remove here */ );
这并不是假设您有一组预定义的密钥要删除,而是假设您有一个删除密钥的条件。从问题中,不清楚这些密钥是手动添加的还是基于某种条件添加的。在后一种情况下,这可能是更干净的代码

对于前一种情况,此(未测试的)代码也可以工作:

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

但是在这种情况下显然要干净得多!

你的建议很好。我猜removeAll(keySet)正在做我在其中做的事情,从“效率”的角度来说,这可能只是一个for循环,但从更干净的代码的角度来说,很好:)一旦你看到它,很明显-谢谢!仍然让我感到困惑的是,为什么Map有removeAll,而且就这一点而言,它不能直接在entrySet上执行。这无法解决删除多个选定键的实际请求,因为它没有select参数。@Dildepak,“select参数”是什么意思?