Почему мой вызов 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
Ответы
Ответ 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, будет вызван нужный метод.
Вторая проблема: каждый раз, когда вы удаляете элемент списка, индексы всех последующих элементов меняются, так как эти элементы "сдвинуты" вниз. Есть несколько способов обойти это. Один - сортировать список индексов в порядке убывания. Другим было бы использовать набор индексов, создать новый массив и скопировать в новый массив только те элементы, индекс которых не находится в наборе.
Ответ 3
javax.swing.JCheckBox [...]
Кроме того, попробуйте удалить элементы по значению объектов, например здесь:
http://www.easywayserver.com/blog/java-remove-element-in-arraylist/