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);
}
答案 0 :(得分:8)
当您删除i
元素时,i+1
元素将成为i
元素。由于您在每次迭代中增加i
,因此您跳过列表中的一半元素。
此循环将删除所有元素:
for(int i = 0; i < list.size();) {
list.remove(i);
}
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
,但由于转移,这将是非常低效的方式。