Удаление данных из списка при повторении 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()
}
}
Вы также можете прочитать эту статью.