迭代时删除集合中的元素



我有以下场景:在details变量中,我需要根据条件为每个学生从可变的课程集中删除一门课程。

如果我像下面所做的那样删除,我会得到并发修改异常,因为我在迭代变量的同时修改它

我如何反向迭代映射,使其不会引发死锁,或者有更好的方法来处理这种情况?

val details = MutableMap<Student, MutableSet<CourseDetail>>
details?.forEach { student, courses ->
courses?.forEach { course ->
if (b?.contains(course) == false) {
details[student]?.remove(course)
}
}
}

听起来你只是想要

for (courses in details.values) {
courses.retainAll(b)
}

(值得注意的是,您还应该避免空集合,这样就不必将?.分散到任何地方。(

您可以使用ConcurrentHashMap和ConcurrentHashSet来提供线程安全或

在迭代时,只需使用迭代器删除元素

details?.forEach { student, courses ->
Iterator<CourseDetail> itr = courses.iterator();
while (itr.hasNext())
if (b?.contains(itr.next()) == false) itr.remove();
}

最新更新