我有一个人对象,其中有一个性别字段对象的人添加到列表,然后我想从列表中删除的人谁具有男子
enum class Gender{
woman, man
}
fun main(args: Array<String>) {
data class Person(var name: String, var surname: String, var gender: Gender)
val person1 = Person("Jan", "Kowalski", Gender.man)
val person2 = Person("Paweł", "Pawelski", Gender.man)
val person3 = Person("Ewa", "Miła", Gender.woman)
val person4 = Person("Gosia", "Zemvba", Gender.woman)
var PersonList = listOf<Person>(person1, person2, person3, person4).toMutableList()
val listIterator2 = PersonList.iterator()
while (listIterator2.hasNext()) {
var tmp = listIterator2.next()
if (tmp.gender == Gender.man) {
println( "deleted " + tmp)
PersonList.remove(tmp)
}
}
}
在var tmp = listIterator2.next()行中,我遇到了一个错误
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1012)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:966)
at TmpKt.main(tmp.kt:19)
3条答案
按热度按时间cdmah0mi1#
您必须在迭代器本身上调用
remove
,而不是在列表上。使用
removeAll()
比直接使用迭代器更容易:cnh2zyt32#
您可以生成一个新列表,如下所示,而不是处理原始列表:
(or,如上面的Tenfour04所建议的,
removeAll
或filterNot
也可用于反转条件)看看这个Playground,自己试试吧:https://pl.kotl.in/LGkr_cobj
y1aodyip3#
***迭代器***在另一个线程修改集合时并不总是有用的。我尝试过很多方法,但后来意识到手动遍历集合要安全得多(向后表示删除):