145

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

这工作正常。更好的方法是什么?

4

4 回答 4

284

假设您的集合包含要删除的keySet字符串,您可以使用方法and 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"
于 2013-07-16T11:55:38.053 回答
13

为了完成,并且当您寻找实现此目标的方法时,Google 会将您带到这里:

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

这并不假定您有一组预定义的要删除的键,而是假定您有一个应该删除键的条件。从问题来看,尚不清楚这些键是手动添加还是基于某种条件。在后一种情况下,这可能是更简洁的代码。

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

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

但显然@assylias 提供的答案在这种情况下要干净得多!

于 2020-11-04T14:24:10.410 回答
9

只是为了完整起见:

正如猜测的那样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());
    }
}
于 2017-02-14T19:35:11.307 回答
4

使用 Java 流:

keySet.forEach(map::remove);
于 2019-09-25T13:36:05.250 回答