【问题标题】:ArrayList index out of bounds exceptionArrayList 索引越界异常
【发布时间】:2014-02-02 05:52:37
【问题描述】:

最近在使用 arrayList 时,我发现了一个奇怪的问题。我想在arraylist中保留2个元素,并希望将object1保留在元素0中,将object2保留在element1中。

我正在循环决定这个。

当它恰好添加第一个元素时,它会抛出 indexOutofBounds。根据 java doc,因为索引大于大小,所以这样做。

public static void main(String[] args) 
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add(1,"SECONDITEM"); // throwing  due to size is not set
        list.add(0,"FIRSTITEM");

        int postn=0;
        for(String item:list){

            System.out.println("Position "+postn+" :"+item);
            postn++;
        }
    }

然后我尝试将其他项目设置为 0,1 元素中的占位符并尝试做同样的事情

    public static void main(String[] args) 
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add(0,"x");
        list.add(1,"y");

        list.add(1,"SECONDITEM");

        list.add(0,"FIRSTITEM");

        int postn=0;
        for(String item:list){

            System.out.println("Position "+postn+" :"+item);
            postn++;
        }
    }

    Output:
    Position 0 :FIRSTITEM
    Position 1 :x
    Position 2 :SECONDITEM
    Position 3 :y

如何解决这个问题。我发现的一种方法是删除索引中的元素并添加元素。有没有更好的选择。

public static void main(String[] args) 
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add(0,"x");
        list.add(1,"y");
        list.remove(1);
        list.add(1,"SECONDITEM");
        list.remove(0);
        list.add(0,"FIRSTITEM");

        int postn=0;
        for(String item:list){

            System.out.println("Position "+postn+" :"+item);
            postn++;
        }
    }

    Position 0 :FIRSTITEM
    Position 1 :SECONDITEM

【问题讨论】:

  • 呃,不要使用ArrayList
  • 创建您自己的 LinkdList 类来处理这种情况。或者在执行任何特定于索引的添加之前,向 ArrayList 添加尽可能多的默认值
  • 我有同样的问题,为什么?

标签: java arraylist replace indexoutofboundsexception


【解决方案1】:

.add() 方法 在给定位置插入元素并相应地移动另一个元素

要覆盖特定索引处的值,您必须使用 .set(position, value)

尝试设置方法..

    list.add(0,"x");
    list.add(1,"y");

    list.set(1,"SECONDITEM");

    list.set(0,"FIRSTITEM");

现在它将返回仅有的两个值。

【讨论】:

    【解决方案2】:


    当您按此顺序调用时:

    ArrayList<String> list = new ArrayList<String>();
    list.add(1,"SECONDITEM"); // throwing  due to size is not set
    

    您正在尝试添加到位置“1”,但尚未将任何内容添加到列表中。我相信这就是你得到错误的原因。相反,您可能只想使用:

    ArrayList<String> list = new ArrayList<String>();
    list.add("FIRSTITEM");
    

    因为它是一个空列表。您也可以使用索引,但每次都必须递增。有意义吗?

    【讨论】:

    • 很确定 OP 知道这一点,因为他们在 Q 中说过。
    【解决方案3】:

    问题是......您试图以不打算使用的方式使用List。正如您所发现的,您无法设置或添加超出当前大小范围的索引。

    如果您事先知道所需的尺寸并且它是固定尺寸,则使用String[] 是更好的选择。

    如果您真的想要/需要一个允许随机访问集而不管当前大小的动态结构,请编写您自己的方法来在需要时填充列表:

    public static <T> void fillAndSet(int index, T object, List<T> list) 
    {
        if (index > (list.size() - 1))
        {
            for (int i = list.size(); i < index; i++)
            {
                list.add(null);
            }
            list.add(object);
        }
        else
        {
            list.set(index, object);
        }
     }
    

    【讨论】:

    • 我从一开始就知道大小,但我想从 1 开始初始化它(因此可以清楚地看到正在发生的事情 - 这是测试中的数据集)。你对这种情况有想法吗?一张地图? :/ 并不是所有的元素都被设置了——它们的一部分是空的,故意的。
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多