У меня возникла странная проблема. Я думал, что это будет стоить мне нескольких минут, но я борюсь уже несколько часов... Вот что я получил.:
for (inti=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 (inti= 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], отсюда и пропуск.
Вот действительно простой способ обойти это: (обратный отсчет вместо увеличения)
Это потому, что когда вы удаляете элемент из списка, элементы списка перемещаются вверх. Итак, если вы удалите первый элемент, т. е. с индексом 0, элемент с индексом 1 будет смещен на индекс 0, но ваш счетчик циклов будет продолжать увеличиваться с каждой итерацией. таким образом, вместо обновленного 0-го элемента индекса вы получаете 1-й элемент индекса. Поэтому просто уменьшайте счетчик на единицу каждый раз, когда вы удаляете элемент из своего списка.
Вы можете использовать приведенный ниже код, чтобы заставить его работать нормально :
for (inti=0; i < data.size(); i++){ if (data.get(i).getCaption().contains("_Hardi")){ data.remove(i); i--; } }