我有一个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
答案 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/