Kotlin RemoveAt пропускает 1 значение за итерацию?

#kotlin

#kotlin

Вопрос:

Я реализую функцию разбивки на страницы, которая помещает элементы в изменяемый список с помощью add(index, item), и при достижении порогового значения размера ряд элементов удаляется с помощью RemoveAt(index), начиная с индекса от 0 до n . Затем добавляются дополнительные элементы и так далее. Вот журнал отладки, поведение просто странное.

 D: add(index,item) INDEX = 0, value is = VALUE 1
D: ##############
D: add(index,item) INDEX = 1, value is = VALUE 2
D: ##############
D: add(index,item) INDEX = 2, value is = VALUE 3
D: ##############
D: add(index,item) INDEX = 3, value is = VALUE 4
D: ##############
D: add(index,item) INDEX = 4, value is = VALUE 5
D: ##############
D: ************************************************************
D: add(index,item) INDEX = 5, value is = VALUE 6
D: ##############
D: add(index,item) INDEX = 6, value is = VALUE 7
D: ##############
D: add(index,item) INDEX = 7, value is = VALUE 8
D: ##############
D: add(index,item) INDEX = 8, value is = VALUE 9
D: ##############
D: add(index,item) INDEX = 9, value is = VALUE 10
D: ##############
D: ************************************************************
D: add(index,item) INDEX = 10, value is = VALUE 11
D: ##############
D: add(index,item) INDEX = 11, value is = VALUE 12
D: ##############
D: add(index,item) INDEX = 12, value is = VALUE 13
D: ##############
D: add(index,item) INDEX = 13, value is = VALUE 14
D: ##############
D: add(index,item) INDEX = 14, value is = VALUE 15
D: ##############
D: ************************************************************
D: add(index,item) INDEX = 15, value is = VALUE 16
D: ##############
D: add(index,item) INDEX = 16, value is = VALUE 17
D: ##############
D: add(index,item) INDEX = 17, value is = VALUE 18
D: ##############
D: add(index,item) INDEX = 18, value is = VALUE 19
D: ##############
D: add(index,item) INDEX = 19, value is = VALUE 20
D: ##############
D: ************************************************************
D: NOW THRESHOLD IS REACHED, ORDER OF FINAL MUTABLE LIST IS...
D: ITEM AT INDEX = 0 IS = VALUE 1
D: ##############
D: ITEM AT INDEX = 1 IS = VALUE 2
D: ##############
D: ITEM AT INDEX = 2 IS = VALUE 3
D: ##############
D: ITEM AT INDEX = 3 IS = VALUE 4
D: ##############
D: ITEM AT INDEX = 4 IS = VALUE 5
D: ##############
D: ITEM AT INDEX = 5 IS = VALUE 6
D: ##############
D: ITEM AT INDEX = 6 IS = VALUE 7
D: ##############
D: ITEM AT INDEX = 7 IS = VALUE 8
D: ##############
D: ITEM AT INDEX = 8 IS = VALUE 9
D: ##############
D: ITEM AT INDEX = 9 IS = VALUE 10
D: ##############
D: ITEM AT INDEX = 10 IS = VALUE 11
D: ##############
D: ITEM AT INDEX = 11 IS = VALUE 12
D: ##############
D: ITEM AT INDEX = 12 IS = VALUE 13
D: ##############
D: ITEM AT INDEX = 13 IS = VALUE 14
D: ##############
D: ITEM AT INDEX = 14 IS = VALUE 15
D: ##############
D: ITEM AT INDEX = 15 IS = VALUE 16
D: ##############
D: ITEM AT INDEX = 16 IS = VALUE 17
D: ##############
D: ITEM AT INDEX = 17 IS = VALUE 18
D: ##############
D: ITEM AT INDEX = 18 IS = VALUE 19
D: ##############
D: ITEM AT INDEX = 19 IS = VALUE 20
D: ##############
D: *************************************************************
D: removeAt(index) = 0, value is = VALUE 1
D: ##############
D: removeAt(index) = 1, value is = VALUE 3
D: ##############
D: removeAt(index) = 2, value is = VALUE 5
D: ##############
D: removeAt(index) = 3, value is = VALUE 7
D: ##############
D: removeAt(index) = 4, value is = VALUE 9
D: ##############
D: removeAt(index) = 5, value is = VALUE 11
D: ##############
D: removeAt(index) = 6, value is = VALUE 13
D: ##############
D: removeAt(index) = 7, value is = VALUE 15
D: ##############
D: removeAt(index) = 8, value is = VALUE 17
D: ##############
D: removeAt(index) = 9, value is = VALUE 19
D: ##############
  

Итак, здесь мой порог составляет 20 элементов, и я отбрасываю 10, но, как вы можете видеть, индексы по какой-то причине не совпадают, хотя я не применял никаких других промежуточных методов…

вот как я добавляю элементы, я изменил его, чтобы показать журнал, прежде чем использовать addAll(список), но поведение остается тем же с add(index, item)

 if (status == SUCCESS) {
                val i = if (pageSnapshotHolder.isNotEmpty()) pageSnapshotHolder.lastIndex 1 else 0
                var index = i
                for (item in data.content!!) {
                    pageSnapshotHolder.add(index,item)
                    Log.d("PaginationManager", "ADDING ITEM AT INDEX = $index, value is = ${item.title}")
                    Log.d("PaginationManager","##############")
                    index  
                }
                Log.d("PaginationManager","****************************************************************************************************************************************************************************")
            }
  

И вот как я удаляю элементы

  if (pageSnapshotHolder.size > 15) {

                Log.d("PaginationManager", "NOW THRESHOLD IS REACHED, ORDER OF FINAL MUTABLE LIST IS...")
                for ((index, item) in pageSnapshotHolder.withIndex()) {
                    Log.d("PaginationManager","ITEM AT INDEX = $index IS = ${item.title}")
                    Log.d("PaginationManager","##############")
                }
                Log.d("PaginationManager","****************************************************************************************************************************************************************************")

                for (index in 0..10) {
                    val a = pageSnapshotHolder.removeAt(index)
                    Log.d("PaginationManager", "DROPPING ITEM AT INDEX = $index, value is = ${a.title}")
                    Log.d("PaginationManager","##############")
                } 
                Log.d("PaginationManager","****************************************************************************************************************************************************************************")
            }
  

Комментарии:

1.Это не ошибка в Kotlin, а ваш код: removeAt сдвигает все индексы оставшихся элементов, но ваш код не учитывает, что следующее значение находится в той же позиции.

2. я понимаю это сейчас, поэтому, поскольку список сокращается на каждую итерацию цикла for, тогда ожидаемый следующий индекс отстает, спасибо !!, что я должен сделать, это вместо этого запустить цикл, но удалить всегда индекс 0, я думаю

Ответ №1:

Это происходит естественным образом, потому что вы увеличиваете индекс удаления только на 1 каждый раз, не учитывая тот факт, что значения, превышающие удаленное, теперь «сдвинуты вниз» (визуально сдвинуты вверх ниже) в массиве:

Вот что происходит визуально:

Перед удалением:

 Index  Value
0      1
1      2
2      3
3      4
4      5
5      6
...
  

Удалить элемент с индексом 0 = значение «1» (согласно приведенному выше)

 Index  Value
0      2
1      3
2      4
3      5
4      6
...
  

Удалить элемент с индексом 1 = значение «3» (согласно приведенному выше)

 Index  Value
0      2
1      4
2      5
3      6
...
  

Удалить элемент с индексом 2 = значение «5» (согласно приведенному выше)

и т.д…

Ответ №2:

Как указал Луис, индексы сдвигаются при удалении элемента из списка, поэтому вместо итерации, подобной

 for(i in 0..10) { list.removeAt(i)}
  

Я должен сделать так

 for(i in 0..10) {list.removeAt(0)}
  

Комментарии:

1. Поскольку вы не используете i , вы могли бы использовать repeat(11) вместо for (i in 0..10) . Если вы часто удаляете список с начала, вероятно, будет эффективнее использовать LinkedList и использовать removeFirst() .

2. @Tenfour04 да, я определенно много удаляю и добавляю списки, причем с обеих сторон, с самого начала, а также с конца. Не могли бы вы дать небольшой фрагмент с LinkedList ?

3. Фрагмент того, что с ним делать? Вы можете заменить removeAt(0) на removeFirst() при использовании LinkedList .