为什么ArrayList.remove不起作用

Cod*_*ypt 10 java arraylist

我有以下代码 -

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但在这里它给了我输出 -

[Chris, Lois, Meg, Meg, Brain, Peter, Stewie]
[Chris, Lois, Meg, Brain, Peter, Stewie]
Run Code Online (Sandbox Code Playgroud)

我没有明白这一点,为什么这不是删除,Meg但我Meg在这种情况下只尝试了一个它正在工作.而当我Meg在最后添加更多时,我Meg没有从中删除ArrayList.为什么?

tia*_*anz 23

当您删除第一个"Meg"时,索引i=2.然后它会增加,但由于其中一个"梅格"已被删除,现在name.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);
    }
}
Run Code Online (Sandbox Code Playgroud)


dtg*_*gee 5

您正在迭代第一个Meg,当它Meg被删除时,数组值会转移一个.

[Chris, Lois, Meg, Meg, Brain, Peter, Stewie]
   0     1     2    3     4      5       6
Run Code Online (Sandbox Code Playgroud)

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

[Chris, Lois, Meg, Brain, Peter, Stewie]
   0     1     2     3      4      5      
Run Code Online (Sandbox Code Playgroud)

尝试向后迭代.

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