#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 .