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

2022-09-02 02:05:25

我遇到了一个奇怪的问题。我以为这会花费我几分钟,但我现在挣扎了几个小时......这是我得到的:

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

在 ArrayList 中,我得到了一些字符串(总共 14 个左右),其中 9 个字符串的名字_Hardi。dataArrayList.

使用上面的代码,我想删除它们。如果我用一个,那么它会打印出9次的东西,什么是好的,因为_Hardi在ArrayList中有9次。replace data.remove(i);System.out.println

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

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

然后,它仅删除偶数(1,3,5等)。他一直在跳过1,但不知道为什么。

如何解决这个问题?或者也许是另一种删除它们的方法?


答案 1

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

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

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

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

否则,请从末尾删除。

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

答案 2

在循环访问列表时,不应从列表中删除项目。相反,请使用类似:Iterator.remove()

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

推荐