繁体   English   中英

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

[英]remove a string from an array list

我一直收到这个错误:

java.lang.IndexOutOfBoundsException:索引:3,大小:3

我试图删除字符串“梅格”,它将编译,但我不断收到此错误。

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);
        }
    }
}

如果你想删除"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);
        }
    }
}

让我们来看看这个算法吧。

我们从这个列表开始。 我们将按插入顺序对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)。

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

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

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

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个元素。

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

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

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

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

循环后i = 2
0兆
1兆
(脑部删除,指数转移)
2彼得
3 stewei

当删除stewei时i = 3
0兆
1兆
2彼得

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM