ArrayIndexOutOfBoundsException при выполнении удаления на карте - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь удалить значение с карты, когда не отмечен, но по какой-то причине он дает мне IndexOutOfBoundsException

itemView.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
    item.isChecked = isChecked
    if(isChecked){
     map.put(position,true)
    } else {
        map.removeAt(position)
    }
}

Здесь у меня есть 2 флажка, когда я проверяю оба в порядке. Когда я снимаю галочку с первого, все в порядке, но когда я пытаюсь снять галочку и со второго, он вылетает с этой ошибкой

 java.lang.ArrayIndexOutOfBoundsException: src.length=11 srcPos=2 dst.length=11 dstPos=1 length=-1

Проблема в map.removeAt(position), но я не знаю, почему она не работает потому что эта позиция является элементом из массива, который действительно существует.

Я использую SparseBooleanArray.

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Проблема не в позиции массива, как я уже сказал, потому что этот массив никогда не меняется (я никогда не удаляю на нем никаких элементов, просто удаляю значения на карте, которая содержит эти сопоставленные логические значения)

Итак проблема была в removeAt (position)

Пример

У меня есть массив Map с 2 значениями

0 - true
1 - true

Если я сделаю map.RemoveAt(0), теперь у меня

1 - true (actually in position 0 right now)

но теперь, если я попытаюсь сделать это снова map.removeAt(1), там нет элемента в позиции 1, поэтому он является неограниченным

Я решил это, удалив ключом на карте

map.remove(position,true) 

Таким образом, это удалит это 1 - истинное значение и только значения с истинным значением этой карты

0 голосов
/ 14 апреля 2020

Я видел ответ, который вы отправили. Да, вы правильно поняли. Вы получали IndexOutOfBoundException, потому что искомая позиция уже удалена.

Однако вам не нужно использовать пару key-value, чтобы удалить этот элемент с вашей карты. Это уменьшает масштабируемость вашего Map объекта, поскольку где-то в будущем это значение может быть изменено, и если вы не знаете об этом изменении, вы можете столкнуться с аналогичной проблемой, когда данные не будут удалены. Давайте возьмем следующий пример.

0 - true 1 - true

Теперь где-то вы изменили значение для ключа 1 на false. Следовательно, когда вы позвоните map.remove(position, true), вы не найдете ничего, что можно удалить.

Я бы рекомендовал использовать функцию удаления только с ключом. Следующего должно быть достаточно.

if (map.containsKey(position)) map.remove(position);

Надеюсь, это поможет!

0 голосов
/ 14 апреля 2020

Ваш код не показывает, где устанавливается position, но, если бы я догадался, вам, вероятно, нужно сделать position - 1

Помните, что ваши массивы 0 проиндексированы!

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