ArrayList.remove 在循环中不起作用

2022-09-03 17:11:56

我有以下代码-

import java.util.ArrayList;

public class ArrayListExp{
    public static void main (String[] args){

        ArrayList<String> name = new ArrayList<String>();

        name.add("Chris");
        name.add("Lois");
        name.add("Meg");
        name.add("Meg");
        name.add("Brain");
        name.add("Peter");
        name.add("Stewie");

        System.out.println(name);

        for ( int i = 0;  i < name.size(); i++){
            String oldName = name.get(i);
            if(oldName.equals("Meg"))
            {
                name.remove(i);
            }
        }

        System.out.println(name);
    }
}

但在这里它给了我输出 -

[Chris, Lois, Meg, Meg, Brain, Peter, Stewie]
[Chris, Lois, Meg, Brain, Peter, Stewie]

我不明白,为什么这不是删除,但我只尝试过一个在这种情况下它正在工作。而我,当我在最后添加更多时,该一个不会从中删除。为什么?MegMegMegMegArrayList


答案 1

当您删除第一个“Meg”时,索引.然后它递增,但是由于其中一个“Meg”已经被删除,现在是“大脑”。所以你实际上没有检查第二个“Meg”。i=2name.get(3)

若要解决此问题。您可以在删除元素时递减索引:

public class ArrayListExp{
    public static void main (String[] args){

        ArrayList<String> name = new ArrayList<String>();

        name.add("Chris");
        name.add("Lois");
        name.add("Meg");
        name.add("Meg");
        name.add("Brain");
        name.add("Peter");
        name.add("Stewie");

        System.out.println(name);

        for ( int i = 0;  i < name.size(); i++){
            String oldName = name.get(i);
            if(oldName.equals("Meg"))
            {
                name.remove(i);
                i--;
            }
        }

        System.out.println(name);
    }
}

答案 2

您正在迭代第一个 ,当它被删除时,数组值会移动一个。MegMeg

[Chris, Lois, Meg, Meg, Brain, Peter, Stewie]
   0     1     2    3     4      5       6

首先被删除,循环递增 i,因为它完成了 for 循环内的所有内容,因此现在将为 3 并且数组已被修改:Megi

[Chris, Lois, Meg, Brain, Peter, Stewie]
   0     1     2     3      4      5      

尝试向后迭代。

for ( int i = name.size() - 1;  i >= 0; i--){
    String oldName = name.get(i);
    if(oldName.equals("Meg"))
    {
        name.remove(i);
    }
}

推荐