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

zig*_*don 13 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());
Run Code Online (Sandbox Code Playgroud)

如果get()调用也返回了false值,我会得到它,但它实际上会返回有问题的对象.我在这里错过了什么?

上面代码的输出:

Size before removing: 3
Removing id: 2: 
javax.swing.JCheckBox[...]
false
Size after removing: 3
Run Code Online (Sandbox Code Playgroud)

ILM*_*tan 31

我的猜测是您有这样一个事实的问题remove()超载既intObject,而get()只需要一个int.试试remove(toRemove.get(i).intValue()).

remove(Object)from AbstractCollection将搜索列表并删除给定的对象,因为你发送它Integer并且列表只有JCheckBoxs ,所以它不会出现.您正在尝试调用remove(int),但因为您正在调用它Integer,所以会调用Object重载.通过将转换Integer为a int,可以避免此问题

此外,您是否可以始终确保toRemove中的Id始终等于索引?如果toRemove不是最大到最小的顺序,它将不会.