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

Java 为什么我的ArrayList.remove(id)调用不起作用?,java,debugging,arraylist,Java,Debugging,Arraylist,我有一个ArrayList,其中包含许多我想删除的项。我将要删除的项目的ID存储在另一个列表中。我认为以下代码应该可以正常工作,但由于某些原因,remove()调用返回的值为false: ArrayList<Integer> toRemove = new ArrayList<Integer>(); ArrayList<JCheckBox> al = new ArrayList<JCheckBox>(); /* Code that ad

我有一个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());

javax.swing.JCheckBox[…]

此外,请尝试按对象值删除元素,如下所示:
我猜您遇到了一个问题,
remove()
同时重载了
int
对象
,而
get()
只接受
int
。尝试
删除(toRemove.get(i).intValue())

remove(Object)
from
AbstractCollection
将搜索列表并删除给定对象,该对象不在列表中,因为您向其发送的是一个
整数,而列表中只有
JCheckBox
s。您试图调用
remove(int)
,但由于您给它一个
整数
,因此将调用对象重载。通过将
整数
转换为
整数
,可以避免此问题


另外,您能否始终确保toRemove中的Id始终等于索引?如果toRemove不是按从大到小的顺序排列的,那么它就不是。

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


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

你能发布“al”和“toRemove”的确切声明吗?发布了要求的定义。谢谢-这很有效!是的,当我构建TrimeFo时,我确信它是有序的,所以当我以相反的顺序进行它时,我不需要在移除元素时调整索引。这个答案不考虑<代码> null <代码>。objects@Salman这个问题意味着不存在
null
s。如果存在
null
调用,则
remove()
调用上方的行在将参数解装箱到外部
get()
调用时将抛出null指针。
Size before removing: 3
Removing id: 2: 
javax.swing.JCheckBox[...]
false
Size after removing: 3