Android

Delete data from ArrayList with a For-loop

Удаление данных из ArrayList с помощью For-цикла

У меня возникла странная проблема. Я думал, что это будет стоить мне нескольких минут, но я борюсь уже несколько часов... Вот что я получил.:

for (int i = 0; i < size; i++){
if (data.get(i).getCaption().contains("_Hardi")){
data.remove(i);
}
}

data Это ArrayList.
В ArrayList у меня есть несколько строк (всего 14 или около того), и 9 из них содержат имя _Hardi .

И с помощью приведенного выше кода я хочу удалить их. Если я replace data.remove(i); с помощью a System.out.println, то он выводит что-то 9 раз, что хорошо, потому что _Hardi находится в ArrayList 9 раз.

Но когда я использую data.remove(i);, это удаляет не все 9, а только несколько. Я провел несколько тестов и также увидел это:

Когда я переименовываю строки в: Hardi1 Hardi2 Hardi3 Hardi4 Hardi5 Hardi6

Затем он удаляет только четные числа (1, 3, 5 и так далее). Он все время пропускает 1, но не может понять почему.

Как это исправить? Или, может быть, другой способ удалить их?

Переведено автоматически
Ответ 1

Проблема здесь в том, что вы выполняете итерацию от 0 до size и внутри цикла удаляете элементы. Удаление элементов уменьшит размер списка, что приведет к сбою при попытке получить доступ к индексам, которые превышают эффективный размер (размер после удаленных элементов).

Для этого есть два подхода.

Удалите с помощью итератора, если вы не хотите иметь дело с индексом.

for (Iterator<Object> it = data.iterator(); it.hasNext();) {
if (it.next().getCaption().contains("_Hardi")) {
it.remove();
}
}

В противном случае, удалите с конца.

for (int i = size-1; i >= 0; i--){
if (data.get(i).getCaption().contains("_Hardi")){
data.remove(i);
}
}
Ответ 2

Вы не должны удалять элементы из списка во время итерации по нему. Вместо этого используйте Iterator.remove() like:

for (Iterator<Object> it = list.iterator(); it.hasNext();) {
if ( condition is true ) {
it.remove();
}
}
Ответ 3

Каждый раз, когда вы удаляете элемент, вы меняете индекс элемента перед ним (поэтому, когда вы удаляете list[1], list[2] становится list[1], отсюда и пропуск.

Вот действительно простой способ обойти это: (обратный отсчет вместо увеличения)


for(int i = list.size() - 1; i>=0; i--)
{
if(condition...)
list.remove(i);
}

Ответ 4

Это потому, что когда вы удаляете элемент из списка, элементы списка перемещаются вверх. Итак, если вы удалите первый элемент, т. е. с индексом 0, элемент с индексом 1 будет смещен на индекс 0, но ваш счетчик циклов будет продолжать увеличиваться с каждой итерацией. таким образом, вместо обновленного 0-го элемента индекса вы получаете 1-й элемент индекса. Поэтому просто уменьшайте счетчик на единицу каждый раз, когда вы удаляете элемент из своего списка.

Вы можете использовать приведенный ниже код, чтобы заставить его работать нормально :

for (int i = 0; i < data.size(); i++){
if (data.get(i).getCaption().contains("_Hardi")){
data.remove(i);
i--;
}
}
2023-05-22 10:40 java android arraylist