簡體   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