我一直收到这个错误:
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);
}
}
}
答案 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可用....因此错误即将来临。