【发布时间】:2021-05-17 09:14:54
【问题描述】:
例如,如果我有一个包含 10 个键的 HashMap,但只有 4 个键有值。如何返回这些键的 SetView。我只找到了 Map
【问题讨论】:
-
请阅读How to ask 并更新您的问题。
标签: java hashmap set key keyset
例如,如果我有一个包含 10 个键的 HashMap,但只有 4 个键有值。如何返回这些键的 SetView。我只找到了 Map
【问题讨论】:
标签: java hashmap set key keyset
使用keySet()方法,遍历Set中的每个Entry,每次检查Entry的值。如果此“值”为空,则我们将其从 Set 中删除。
Set<Map.Entry<String, String>> entrySet = new HashSet<>(yourMap.entrySet());
for(Map.Entry<String, String> entry : entrySet){
if(entry.getValue() == null){
entrySet.remove(entry);
}
}
结果集“entrySet”就是你要找的东西
【讨论】:
entrySet() 返回地图的 视图,因此当您调用 remove() 时,您正在从地图本身中删除条目。 --- 错误2:在迭代时调用remove(entry)会导致ConcurrentModificationException。
HashSet的Javadoc:这个类的iterator方法返回的迭代器是fail-fast:如果集合在迭代器创建后的任何时间被修改,除了通过迭代器自己的remove 方法外,迭代器以任何方式抛出ConcurrentModificationException。因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。请注意,无法保证迭代器的快速失败行为
Map<String, String> map = new HashMap<>();
map.entrySet().stream()
.filter(e -> e.getValue() != null)
.map(Entry::getKey)
.collect(Collectors.toSet());
Set<String> keys = new HashSet<>();
for (Map.Entry<String, String> e : map.entrySet()) {
if (e.getValue() != null) {
keys.add(e.getKey());
}
}