【问题标题】:remove a string from an array list从数组列表中删除一个字符串
【发布时间】:2013-10-27 23:25:29
【问题描述】:

我不断收到此错误:

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

【问题讨论】:

  • name.set(i,"Meg");的目的是什么?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我们从这个列表开始。我们将按照插入顺序对 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 个元素 (size=3),我们尝试访问索引 3(但现在最大索引为 2)。

    【讨论】:

    • 我以为最后的名单是“Lois, Meg, Peter”。我忘记了添加。太棒了。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我相信在这种情况下索引 3 仍然存在。
      • @JeroenVannevel 每次迭代后,列表的大小都减少了 1,在第四次迭代时(当 i 为 3 时),当调用 set(3) 时,列表的大小为 3。
      • 抛出异常时,OP 的列表如下所示:"Lois", "Meg", "Peter"
      【解决方案5】:

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

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

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

      对于 i=1 ,循环后的场景是
      0 兆
      (meg 已删除的索引已移动)
      1 兆(在最后一个兆上覆盖)
      2脑
      3 彼得
      4 司徒

      for i=2 循环后
      0 兆
      1 兆
      (大脑被删除,索引转移)
      2 彼得
      3 司徒

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 2016-04-26
        • 2021-04-21
        相关资源
        最近更新 更多