2

我不断收到此错误:

java.lang.IndexOutOfBoundsException:索引:3,大小: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);
        }
    }
}
4

5 回答 5

7

如果你想删除"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);
        }
    }
}
于 2013-10-19T01:24:54.727 回答
7

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

我们从这个列表开始。我们将按插入顺序对 Meg 进行编号,以便更容易跟踪(已经有两个,我们也将其他名称替换为“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)将索引 0(现在是 Lois)替换为 Meg(#3)。

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

并将索引 1 替换为 Meg (#4):

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 (Peter) 替换为 Meg (#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 个元素(大小 = 3),我们尝试访问索引 3(但现在最大索引为 2)。

于 2013-10-19T01:25:29.067 回答
2

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

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

for ( int i = 0;  i < name.size(); i++){
    String oldName = name.get(i);
    name.set( i, "Meg");
}
于 2013-10-19T01:08:04.760 回答
1

ArrayList 的大小可变。当您执行 name.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 个元素。

于 2013-10-19T01:08:35.970 回答
0

Remove(index) 将删除该项目并将其余项目移到上一个。

对于 i=0,循环场景之后是 -

克里斯删了。
0 兆(覆盖在 lois)
1 兆
2 兆
3 大脑
4 彼得
5 斯图伊

对于 i=1 ,循环后场景为
0 meg
(meg 删除的索引移动)
1 meg(覆盖在最后一个 meg)
2 brain
3 peter
4steei

for i=2 循环后
0 meg
1 meg
(大脑删除,索引移动)
2 peter
3steei

for i=3 当steei被删除时
0 meg
1 meg
2 peter

没有索引 3 可用....因此错误来了。

于 2013-10-19T01:27:28.820 回答