我有以下场景:在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();
}