繁体   English   中英

ArrayList索引超出范围异常

[英]ArrayList index out of bounds exception

最近在使用arrayList时,我发现了一个奇怪的问题。 我想将2个元素保留在arraylist中,并希望将object1保留在element 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

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

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

尝试设置方法..

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

    list.set(1,"SECONDITEM");

    list.set(0,"FIRSTITEM");

现在它将仅返回两个值。

问题是...您正试图以一种不希望使用的方式来使用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);
    }
 }


当您按此顺序致电时:

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

由于它是一个空列表。 您也可以使用索引,但是每次都必须增加。 说得通?

暂无
暂无

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

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