我有一个Map<String,String>具有大量键值对.现在我想从中删除选定的键Map.以下代码显示了我为实现这一点所做的工作.
Set keySet = new HashSet(); //I added keys to keySet which I want to remove.
Run Code Online (Sandbox Code Playgroud)
然后 :
Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
map.remove( entriesIterator.next().toString());
}
Run Code Online (Sandbox Code Playgroud)
这很有效.我只是想知道,实现我的要求会有什么更好的方法?
ass*_*ias 222
假设您的集合包含要删除的字符串,则可以使用该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"
Run Code Online (Sandbox Code Playgroud)
只是为了完整性:
正如所猜测的那样,它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());
}
}
Run Code Online (Sandbox Code Playgroud)
为了完成起见,并且当您寻找实现此目的的方法时,Google 会将您带到这里:
map.entrySet().removeIf(entry -> /* decide what you want to remove here */ );
Run Code Online (Sandbox Code Playgroud)
这并不假设您有一组预定义的要删除的键,而是假设您有应该删除键的条件。从问题来看,不清楚这些键是手动添加还是基于某种条件。在后一种情况下,这可能是更干净的代码。
对于前一种情况,这个(未经测试的)代码也可以工作:
map.entrySet().removeIf(entry -> keySet.contains(entry.getKey()) );
Run Code Online (Sandbox Code Playgroud)
但显然在这种情况下@assylias 提供的答案要干净得多!