这是我的代码的一部分。
Integer keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex));
someArrayList.remove(keyLocation);
所以我在这里做的是分配keyLocation(reduceFD arrayList中第一次出现的字符串)。但是当我想从someArrayList中删除具有该keyLocation的项时,它将无法工作。
如果我手动输入:
someArrayList.remove(0); //Let's say 0 is the actual keyLocation
这实际上有效。
以下代码的工作原理是什么奇怪:
someArrayList.remove(keyLocation + 1);
任何提示?
这是主循环:
for (int KEYindex = 0; KEYindex < KeyPlus.size(); KEYindex++){
Integer keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex));
if (reducedFD.contains(KeyPlus.get(KEYindex))){
KeyPlus.add(reducedFD.get(keyLocation+1));
CheckedAttributesPlus.add(KeyPlus.get(KEYindex));
reducedFD.remove(keyLocation);
}
}
答案 0 :(得分:76)
问题是你将Integer传递给remove方法,而不是int。传递整数时,它假定整数本身就是您要删除的内容,而不是该索引处的值。比较方法
remove(Object o)
remove(int i)
所以:
int keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex));
someArrayList.remove(keyLocation);
答案 1 :(得分:14)
这是简短说明:
remove(Object o) // remove object
remove(int index) // remove the object in that index
如果您编写.remove(5)
编译器将其理解为基本类型,以及索引并删除index(5).
如果要删除对象,则应编写.remove(new Integer(5))
答案 2 :(得分:3)
List
接口有两个remove()
方法,一个接收Object
(并尝试从列表中删除此对象),另一个接收int
(并尝试删除索引为给定int的对象。
通常,为方法提供Integer
参数会导致自动取消装箱或自动转换为原始int
。在这种情况下,编译器不会尝试自动取消装箱,因为有一个非常好的方法可以接收Object
和Integer instanceof Object
......我猜你的列表不是List<Integer>
这就是它失败的原因。
在Integer
强制自动取消装箱时添加一个int,添加结果为int
- 非常适合其他remove()
方法。
答案 3 :(得分:1)
int keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex)); //Use a primitive int
someArrayList.remove(keyLocation);
答案 4 :(得分:0)
或者你可以这样做:
someArrayList.remove(keyLocation + 0);
答案 5 :(得分:0)
您可以调用此方法而不是创建 int
int a = 0145236
答案 6 :(得分:0)
如果您查看ArrayList
JavaDoc,则会发现此声明。
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public E remove(int index){
.
.
.
}
Integer
与int
不同。以下是否有意义?
someArrayList.remove((int)keyLocation);