为什么我的ArrayList.remove(id)调用不起作用?

时间:2010-08-26 22:16:45

标签: java debugging arraylist

我有一个ArrayList,其中包含我想删除的一些项目。我有要删除的项目的ID存储在另一个列表中。认为以下代码应该可以正常工作,但由于某种原因,remove()调用返回false值:

  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()调用也返回false值,我会得到它,但实际上它确实返回了有问题的对象。我在这里缺少什么?

上面代码的输出:

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

3 个答案:

答案 0 :(得分:31)

我的猜测是,remove()int都超载了Object,而get()只需要int 。试试remove(toRemove.get(i).intValue())

来自remove(Object)

AbstractCollection将搜索列表并删除给定的对象,因为您发送的是Integer而列表中只有{{1} }}秒。您正在尝试调用JCheckBox,但由于您要给它remove(int),因此会调用Object重载。通过将Integer转换为Integer,可以避免此问题

另外,您是否可以始终确保toRemove中的Id始终等于索引?如果toRemove不是最大到最小的顺序,那就不会。

答案 1 :(得分:1)

您的代码存在两个问题。 首先,调用错误的“toRemove”方法。当您调用“toRemove.get(i)”时,返回值将自动装入java.lang.Integer,而不是int。因此,调用java.util.List #remove(Object)而不是java.util.List #remove(int)。它试图删除一个Integer对象,并返回false。 如果将Integer转换为int,则将调用所需的方法。

第二个问题:每次删除列表中的元素时,所有后续元素的索引都会发生变化,因为这些元素会“向下移动”。有几种方法可以解决这个问题。一种是按降序对索引列表进行排序。另一种方法是使用一组索引,创建一个新数组,并将那些索引不在集合中的元素复制到新数组中。

答案 2 :(得分:0)

javax.swing.JCheckBox中[...]?

另外,尝试按对象删除元素值,如下所示: http://www.easywayserver.com/blog/java-remove-element-in-arraylist/