使用For循环从ArrayList中删除数据

Big*_*low 19 java android arraylist

我遇到了一个奇怪的问题.我认为这会花费我几分钟,但我现在正在努力几个小时......这就是我得到的:

for (int i = 0; i < size; i++){
    if (data.get(i).getCaption().contains("_Hardi")){
        data.remove(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

dataArrayList. 在ArrayList中我得到了一些字符串(共14个左右),和他们的9,它得名_Hardi.

使用上面的代码我想删除它们.如果我replace data.remove(i);用a System.out.println然后打印9次,那么好,因为_Hardi在ArrayList中9次.

但是当我使用data.remove(i);它时它不会删除所有9个,而只删除少数几个.我做了一些测试,我也看到了这个:

当我将字符串重命名为:Hardi1 Hardi2 Hardi3 Hardi4 Hardi5 Hardi5 Hardi6

然后它只删除偶数(1,3,5等).他一直在跳过1,但无法弄清楚原因.

如何解决这个问题?或者可能是另一种方法来删除它们?

Ram*_*PVK 45

这里的问题是你从0到大小迭代,在循环内你正在删除项目.删除项目将减小列表的大小,当您尝试访问大于有效大小的索引(删除项目后的大小)时,列表将失败.

有两种方法可以做到这一点.

如果您不想处理索引,请使用迭代器删除.

for (Iterator<Object> it = data.iterator(); it.hasNext();) {
if (it.next().getCaption().contains("_Hardi")) {
    it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)

否则,从最后删除.

for (int i = size-1; i >= 0; i--){
    if (data.get(i).getCaption().contains("_Hardi")){
            data.remove(i);
    }
 }
Run Code Online (Sandbox Code Playgroud)


mat*_*t b 20

迭代时,不应从列表中删除项目.相反,使用Iterator.remove()如下:

for (Iterator<Object> it = list.iterator(); it.hasNext();) {
    if ( condition is true ) {
        it.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)


JMa*_*sch 12

每次删除项目时,您正在更改其前面的索引(因此当您删除列表[1]时,列表[2]变为列表[1],因此跳过.

这是一个非常简单的方法:(倒数而不是向上)


for(int i = list.size() - 1; i>=0; i--)
{
  if(condition...)
   list.remove(i);
}


Sum*_*shi 5

这是因为当您从列表中删除一个元素时,列表的元素会向上移动。因此,如果您删除第一个元素,即索引 0 处的元素,索引 1 处的元素将移至索引 0,但您的循环计数器将在每次迭代中不断增加。所以你得到的不是更新的第 0 个索引元素,而是第一个索引元素。因此,每次从列表中删除一个元素时,只需将计数器减一。

您可以使用以下代码使其正常工作:

for (int i = 0; i < data.size(); i++){
    if (data.get(i).getCaption().contains("_Hardi")){
        data.remove(i);
        i--;
    }
}
Run Code Online (Sandbox Code Playgroud)