从数组列表中删除一个字符串

时间:2013-10-19 01:04:47

标签: java arrays arraylist compiler-errors runtime-error

我一直收到这个错误:

  

java.lang.IndexOutOfBoundsException:Index:3,Size:3

我正在尝试删除字符串“Meg”,它将编译,但我一直收到此错误。

import java.util.ArrayList;

public class CustomerLister2 {
    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");

        for ( int i = 0;  i < name.size(); i++){
            name.get(i);
            name.remove(i);
            name.set(i,"Meg");
        }

        for(String names: name){
            System.out.println(names);
        }
    }
}

5 个答案:

答案 0 :(得分:6)

如果您要删除"Meg",请使用此

import java.util.ArrayList;

public class CustomerLister2 {
    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");


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

        for(String names: name){
            System.out.println(names);
        }
    }
}

答案 1 :(得分:6)

让我们追溯一下这个算法。

我们从这个列表开始。我们将按插入顺序对Megs进行编号,以便更容易跟踪(已经有两个,我们也用“Meg”替换其他名称。)

0: Chris
1: Lois
2: Meg#1
3: Meg#2
4: Brain
5: Peter
6: Stewie

我们从i=0开始,然后致电name.remove(0)。因此,索引0(Chris)被删除,所有剩余的元素向左移动(向下移动):

0: Lois
1: Meg#1
2: Meg#2
3: Brain
4: Peter
5: Stewie

请注意,列表现在是一个较小的元素。

调用name.set(0)用Meg(#3)替换索引0(现在是Lois)。

0: Meg#3
1: Meg#1
2: Meg#2
3: Brain
4: Peter
5: Stewie

这结束了循环的第一遍。现在i=1

我们删除了索引1(Meg#1),这给我们留下了:

0: Meg#3
1: Meg#2
2: Brain
3: Peter
4: Stewie

用Meg(#4)替换索引1:

0: Meg#3
1: Meg#4
2: Brain
3: Peter
4: Stewie

现在i=2。删除索引2:

0: Meg#3
1: Meg#4
2: Peter
3: Stewie

将指数2(彼得)替换为梅格(#5)

0: Meg#3
1: Meg#4
2: Meg#5
3: Stewie

现在i=3。删除索引3:

0: Meg#3
1: Meg#4
2: Peter

现在我们尝试设置索引3,但它不存在。所以我们得到了一个例外。

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

这表明该列表有3个元素(size = 3),我们尝试访问索引3(但最大索引现在为2)。

答案 2 :(得分:2)

调用remove()然后调用set()可能不是您想要做的。也许您只想调用set()来覆盖该索引处的现有元素,而不删除?

Remove从列表中删除一个元素,add添加一个元素,set仅在指定的索引存在时有效。

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

答案 3 :(得分:1)

ArrayLists的大小可变。当你命名.remove(i)时,列表会变小。然后尝试将元素设置为现在不存在的索引。您要么不需要name.remove(i)或将name.set(i,“Meg”)更改为name.add(i,“Meg”)。

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

修改

另请注意,您的代码正在删除索引i处的每个元素。这可能就是为什么每次都在索引3处获得异常的原因。您删除元素0,列表变小。然后删除元素1,列表变小。依此类推,直到你的for循环中的i == 3,并且列表中只有3个元素。

答案 4 :(得分:0)

删除(索引)将删除该项目并移动上面的其他项目。

表示i = 0,循环场景为 -

克里斯删除。
0 meg(在lois上覆盖)
1兆位 2兆位 3脑
4彼得
5 stewei

对于i = 1,循环场景为
之后 0 meg
       (meg删除的指数转移)
1兆(在最后一个meg上覆盖)
2脑 3彼得
4 stewei

循环后,

表示i = 2 0 meg
1兆位  (大脑删除,指数转移)
2彼得
3 stewei

表示i = 3 删除stewei时 0 meg
1兆位 2彼得

没有索引3可用....因此错误即将来临。