Kotlin проблема с удалением объекта в цикле - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть объекты person, у которых есть объекты гендерного поля, которые он добавляет в список, и я хочу удалить из списка людей, у которых есть man


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)

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Вы должны вызвать 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 }
1 голос
/ 03 апреля 2020

Вместо того, чтобы манипулировать исходным списком, вы можете создать новый список, например:

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

(или, как предложено Tenfour04 выше, removeAll или filterNot также можно использовать для инвертирования состояние)

Посмотрите на эту площадку, чтобы попробовать сами: https://pl.kotl.in/LGkr_cobj

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...