Подтвердить что ты не робот

Почему мой вызов ArrayList.remove(id) не работает?

У меня есть ArrayList, который включает в себя несколько элементов, которые я хочу удалить. У меня есть идентификаторы элементов для удаления, сохраненные в другом списке. Выяснилось, что следующий код должен работать тривиально, но по какой-то причине вызовы remove() возвращают ложное значение:

  ArrayList<Integer> toRemove = new ArrayList<Integer>();
  ArrayList<JCheckBox> al = new ArrayList<JCheckBox>();

  /* Code that adds a bunch of items to al, and a few integers to toRemove */

  System.out.println("Size before removing: " + al.size());
  for (int i = toRemove.size() - 1; i >= 0; i--) {
    System.out.println("Removing id: " + toRemove.get(i) + ": ");
    System.out.println(al.get(toRemove.get(i)));
    System.out.println(al.remove(toRemove.get(i)));
  }
  System.out.println("Size after removing: " + al.size());

Я бы получил его, если вызов get() также возвратил ложное значение, но он действительно возвращает объект, о котором идет речь. Что мне здесь не хватает?

Вывод кода выше:

Size before removing: 3
Removing id: 2: 
javax.swing.JCheckBox[...]
false
Size after removing: 3
4b9b3361

Ответ 1

Я предполагаю, что у вас возникла проблема с тем, что remove() перегружен как с int, так и Object, а get() принимает только int. Попробуйте remove(toRemove.get(i).intValue()).

remove(Object) из AbstractCollection выполнит поиск по списку и удалит данный объект, которого не будет, потому что вы отправляете его Integer, а список имеет только JCheckBox s. Вы пытаетесь вызвать remove(int), но поскольку вы даете ему Integer, вместо этого вызывается перегрузка объекта. Преобразуя Integer в int, вы избегаете этой проблемы.

Кроме того, вы всегда можете быть уверены, что Id in toRemove всегда равен индексу? Если toRemove не соответствует наименьшему порядку, это не будет.

Ответ 2

В коде есть две проблемы. Во-первых, вызывается неправильный метод toRemove. Когда вы вызываете "toRemove.get(i)", возвращаемое значение автобоксируется в java.lang.Integer, а не в int. Поэтому java.util.List # remove (Object) вызывается вместо java.util.List # remove (int). Он пытается удалить объект Integer и возвращает false. Если вы передадите Integer в int, будет вызван нужный метод.

Вторая проблема: каждый раз, когда вы удаляете элемент списка, индексы всех последующих элементов меняются, так как эти элементы "сдвинуты" вниз. Есть несколько способов обойти это. Один - сортировать список индексов в порядке убывания. Другим было бы использовать набор индексов, создать новый массив и скопировать в новый массив только те элементы, индекс которых не находится в наборе.