java为什么是我的ArrayList。删除(id)呼叫不工作?
我有一个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()调用也返回了一个假值,我会得到它,但它确实返回了有问题的对象。我错过了什么
上述代码的输出:
Size before removing: 3
Removing id: 2:
javax.swing.JCheckBox[...]
false
Size after removing: 3
# 1 楼答案
您的代码有两个问题。 首先,调用了错误的“toRemove”方法。当调用“toRemove.get(i)”时,返回值将自动装箱到java中。整数,而不是整数。因此,java。util。调用List#remove(Object)而不是java。util。列表#删除(int)。它试图删除整数对象,并返回false。 如果将整数强制转换为int,则将调用所需的方法
第二个问题:每次删除列表中的一个元素时,所有后续元素的索引都会发生变化,因为这些元素被“下移”。有几种方法可以解决这个问题。一种是按降序排列索引列表。另一种方法是使用一组索引,创建一个新数组,并仅将索引不在该集合中的元素复制到新数组中
# 2 楼答案
javax。摆动JCheckBox[…]
此外,请尝试按对象值删除元素,如下所示: http://www.easywayserver.com/blog/java-remove-element-in-arraylist/
# 3 楼答案
我猜你有一个问题,就是
remove()
同时被int
和Object
重载,而get()
只接受int
。试试remove(toRemove.get(i).intValue())
AbstractCollection
中的remove(Object)
将搜索列表并删除给定的对象,该对象不在那里,因为您正在向它发送一个Integer
,而列表中只有JCheckBox
。您正试图调用remove(int)
,但由于您正在给它一个Integer
,因此将调用对象重载。通过将Integer
转换为int
,可以避免此问题另外,您能否始终确保toRemove中的Id始终等于索引?如果toRemove不是按从大到小的顺序排列的,那么它就不会