Удаление данных из списка при повторении kotlin

Я новичок в программировании kotlin. Я хочу, чтобы я хотел удалить определенные данные из списка, итерации через него, но когда я делаю это, мое приложение рушится.

for ((pos, i) in listTotal!!.withIndex()) {

            if (pos != 0 && pos != listTotal!!.size - 1) {

                if (paymentsAndTagsModel.tagName == i.header) {
                    //listTotal!!.removeAt(pos)
                    listTotal!!.remove(i)
                }



            }
        }

ИЛИ

 for ((pos,i) in listTotal!!.listIterator().withIndex()){
            if (i.header == paymentsAndTagsModel.tagName){
                listTotal!!.listIterator(pos).remove()
            }

        }

Исключение, которое я получаю

java.lang.IllegalStateException

Ответ 1

Запрещено изменять коллекцию через свой интерфейс, итерации по ней. Единственный способ изменить содержимое коллекции - использовать Iterator.remove.

Однако использование Iterator может быть громоздким, и в подавляющем большинстве случаев лучше рассматривать коллекции как неизменные, которые поощряет Котлин. Вы можете использовать filter для создания новых коллекций:

listTotal = listTotal.filterIndexed { ix, element ->
    ix != 0 && ix != listTotal.lastIndex && element.header == paymentsAndTagsModel.tagName
}

Ответ 2

Ответ miensol кажется идеальным.

Однако я не понимаю контекст для использования функции withIndex или filteredIndex. Вы можете использовать функцию filter только сами по себе.

Вам не нужен доступ к индексу, в котором находится список, если вы используете списки.

Кроме того, я бы настоятельно рекомендовал работать с классом данных, если вы уже этого не сделали. Ваш код будет выглядеть примерно так.

Класс данных

data class Event(
        var eventCode : String,
        var header : String
)

Логика фильтрации

fun main(args:Array<String>){

    val eventList : MutableList<Event> = mutableListOf(
            Event(eventCode = "123",header = "One"),
            Event(eventCode = "456",header = "Two"),
            Event(eventCode = "789",header = "Three")
    )


    val filteredList = eventList.filter { !it.header.equals("Two") }

}

Ответ 3

использовать removeAll

pushList?.removeAll {  TimeUnit.MILLISECONDS.toMinutes(
      System.currentTimeMillis() - it.date) > THRESHOLD }

Ответ 4

val numbers = mutableListOf(1,2,3,4,5,6)
val numberIterator = numbers.iterator()
while (numberIterator.hasNext()) {
    val integer = numberIterator.next()
    if (integer < 3) {
        numberIterator.remove()
    }
}

Ответ 5

Используйте цикл while, вот функция расширения kotlin:

fun <E> MutableList<E>.removeIfMatch(isMatchConsumer: (existingItem: E) -> Boolean) {
    var index = 0
    var lastIndex = this.size -1

    while(index <= lastIndex && lastIndex >= 0){
        when {
            isMatchConsumer.invoke(this[index]) -> {
                this.removeAt(index)
                lastIndex-- // max is decreased by 1
            }
            else -> index++ // only increment if we do not remove
        }
    }
}

Ответ 6

Следующий код работает для меня:

val iterator = listTotal.iterator()
for(i in iterator){
    if(i.haer== paymentsAndTagsModel.tagName){
        iterator.remove()
    }
}

Вы также можете прочитать эту статью.