循环中删除对象的Kotlin问题

blmhpbnm  于 2022-11-25  发布在  Kotlin
关注(0)|答案(3)|浏览(277)

我有一个人对象,其中有一个性别字段对象的人添加到列表,然后我想从列表中删除的人谁具有男子

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)
cdmah0mi

cdmah0mi1#

您必须在迭代器本身上调用remove,而不是在列表上。

val listIterator2 = PersonList.iterator()
  while (listIterator2.hasNext()) {
      var tmp = listIterator2.next()
      if (tmp.gender == Gender.man) {
          println( "deleted  " + tmp)
          listIterator2.remove()
      }
  }

使用removeAll()比直接使用迭代器更容易:

personList.removeAll { it.gender == Gender.man }
cnh2zyt3

cnh2zyt32#

您可以生成一个新列表,如下所示,而不是处理原始列表:

val personList = listOf<Person>(person1, person2, person3, person4)
  val personListUpdated = personList.filter { it.gender != Gender.man }

(or,如上面的Tenfour04所建议的,removeAllfilterNot也可用于反转条件)
看看这个Playground,自己试试吧:https://pl.kotl.in/LGkr_cobj

y1aodyip

y1aodyip3#

***迭代器***在另一个线程修改集合时并不总是有用的。我尝试过很多方法,但后来意识到手动遍历集合要安全得多(向后表示删除):

for (i in listPersons.size-1 downTo 0) {
    myList.getOrNull(i)?.apply {
       if (gender == Gender.man)
          listPersons.remove(this)
    }
}

相关问题