Arraylist Remove()不起作用

时间:2014-10-07 17:59:25

标签: java arraylist

public static ArrayList<String> remove(ArrayList<String> list, int a) {

    for(int i = 0; i < list.size(); i++){
            list.remove(i);
    }
    return list;
}

为什么此代码不会删除数组中的每个元素?它似乎跳过了一些。当我在最后打印arraylist时它应该是空白的,但它打印出来时仍然有一些元素。

编辑(更多代码):

public static void main(String [] args){
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter some a list of words:");
    String line = scan.nextLine();
    String[] words = line.split(" +");
    ArrayList<String> list  = new ArrayList<String>();
    for(int i=0; i<words.length; i++){
        list.add(words[i]);
    }

    System.out.println("Remove words less than how many characters?");
    int a = scan.nextInt();

    remove(list,a);
    System.out.println(list);
}

5 个答案:

答案 0 :(得分:8)

当您删除i元素时,i+1元素将成为i元素。由于您在每次迭代中增加i,因此您跳过列表中的一半元素。

此循环将删除所有元素:

for(int i = 0; i < list.size();) {
    list.remove(i);
}

Javadoc

  

public E remove(int index)

     

删除此列表中指定位置的元素。 转移任何   左边的后续元素(从索引中减去一个)

现在,如果您希望迭代列表中的所有元素,同时只删除其中的一些元素,则可以执行以下操作:

for(int i = 0; i < list.size(); i++) {
    if (someCondition) {
        list.remove(i);
        i--;
    }
}

这将确保您不会跳过任何元素。

答案 1 :(得分:2)

删除i元素后,所有其他元素都会向下移动。然后,无论如何都会增加i,这会跳过最初位于i == 1的第二个元素。

您可以按向后顺序删除元素以避免这种情况。您也可以在clear()上致电ArrayList

答案 2 :(得分:1)

想象一下,你有10件物品。

第一次迭代

 list.remove(0); The element at the beginning gets removed

第二次迭代

 list.remove(1); What is now the second element gets removed. But the element who is in position 0 is not removed!

第三次迭代

  list.remove(2); What is now the third element gets removed. But the elements now in position 0 and 1 are not changed!

用户removeAll或者,如果要进行迭代,请始终执行remove(0)

答案 3 :(得分:1)

基本上,在每次删除之间,剩余的元素会获得新的位置或新的索引。

在实践中,你真的应该使用

list.clear()

用于此特定用途。

答案 4 :(得分:-1)

  

为什么这不会删除数组中的每个元素?

删除ArrayList中的每个元素后,向左移动其他元素,以便

这样的元素
a,b,c,d

删除(0)将产生

b,c,d

现在当你调用remove(1)时,这将移除位置1处的元素

b,c,d
  ^-this one

所以你最终得到了

b,d

此列表的size()等于2,索引已增加到2,因此您的循环结束,因为i < list.size()条件不再为真。


  

当我在最后打印arraylist时,它应该是空白的,但它打印出来时仍然有一些元素。

如果要删除列表中的所有元素,请使用yourList.clear()方法 如果您想手动删除它们,请在每次前向迭代中使用remove(0)并将条件更改为yourList.size()>0,但由于转移,这将是非常低效的方式。