Java ArrayList.remove()问题

时间:2010-12-24 05:10:19

标签: java

这是我的代码的一部分。

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);

}
}

7 个答案:

答案 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。在这种情况下,编译器不会尝试自动取消装箱,因为有一个非常好的方法可以接收ObjectInteger 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){
    .
    .
    .
}

Integerint不同。以下是否有意义?

someArrayList.remove((int)keyLocation);