2010-08-26 4 views
12

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

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()); 

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

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

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

Можете ли вы разместить точную декларацию для 'al' и 'toRemove'? –

+0

Изложенные определения. – zigdon

ответ

31

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

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

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

+0

Спасибо, что сработало! И да, когда я строю toRemove, я уверен, что все в порядке, так что, когда я перехожу к нему в обратном порядке, мне не нужно настраивать индексы по мере удаления элементов. – zigdon

+0

Этот ответ не учитывает объекты «NULL» – Salman

+0

@Salman Вопрос подразумевает, что нет 'null'. Если бы существовал «null», то строка над вызовом 'remove() вызывала бы нулевой указатель при распаковке аргумента для внешнего вызова get(). – ILMTitan

1

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

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

Смежные вопросы