2014-11-24 170 views
0

我使用ArrayList裏面的ArrayList來創建一個總共10個插槽組,分成另外10個插槽,每個插槽存儲整數。ArrayList <ArrayList <Integer>> IndexOutOfBoundsException

我的代碼: -

import java.util.ArrayList; 

public class abc 
{ 
    public static void main(String[] args) 
    { 
     ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); 

     for(int i=0;i<10;i++) 
     { 
     for(int j=0;j<10;j++) 
     { 
     (a.get(i)).add(j,j); 
     } 
     } 
    } 
} 

錯誤: -

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 

     at java.util.ArrayList.rangeCheck(ArrayList.java:604) 
     at java.util.ArrayList.get(ArrayList.java:382) 
     at abc.main(abc.java:18) 

你能指出我在做什麼錯?

+4

'a.get(i)'失敗,因爲您從未向'a'添加任何內容。 – 2014-11-24 19:45:38

+0

列表列表已經非常難以琢磨,因此您可能還需要考慮在您的循環中修復縮進 – personne3000 2014-11-24 19:49:11

+0

儘管名稱不同,「ArrayList」類的行爲完全不像數組;它的名字是根據它的實施情況來選擇的。它實現了'List'接口,並以零(0)大小開始,而不管其初始容量。因此,您需要將項目添加到列表中才能訪問它們。 – 2014-11-24 19:50:16

回答

3

你想要做的是首先在a中添加一些東西因爲你總是讀取外部列表上的i值,我們在外部循環中添加一個新的數組列表。

import java.util.ArrayList; 

public class abc 
{ 
    public static void main(String[] args) 
    { 
     ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); 
     for(int i=0;i<10;i++) { 
      a.add(new ArrayList<Integer>); 
      for(int j=0;j<10;j++) 
      { 
       (a.get(i)).add(j,j); 
      } 
     } 
    } 
} 
+0

雖然我同意,但我仍然困惑爲什麼'add(j,j)'起作用。是不是在整數的ArrayList? – AdamMc331 2014-11-24 19:51:04

+0

@ McAdam331如果你閱讀[java doc](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#add(int,%20E)),你會發現它會將其添加到該索引處。 – StackFlowed 2014-11-24 19:52:08

+2

@ brso05那它有什麼價值?爲什麼不應該是'add(j)'? – AdamMc331 2014-11-24 19:52:40

1

首先必須的元素添加到陣列之前,您可以訪問:

public static void main(String[] args) 
    { 
     ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); 

     for(int i=0;i<10;i++) 
     { 
      a.add(new ArrayList<Integer>()); 
      for(int j=0;j<10;j++) 
      { 
       (a.get(i)).add(j,j); 
      } 
     } 
    } 

您試圖訪問首次a.get(i)一個不存在的元素。

2

的說是更優雅的解決方案並不需要get和兩個參數add

public class abc 
{ 
    public static void main(String[] args) 
    { 
     ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); 

     for(int i=0;i<10;i++) 
     { 
      ArrayList<Integer> inner = new ArrayList<Integer>(); 
      a.add(inner); 
      for(int j=0;j<10;j++) 
      { 
       inner.add(j); 
      } 
     } 
    } 
} 
1

這會讓你的代碼工作:

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); 

    for(int i=0;i<10;i++) 
    { 
     a.add(new ArrayList<Integer>()); //Add this line 
     for(int j=0;j<10;j++)    
      a.get(i).add(j); //You should only add 1 integer value 
    } 

原因的附加聲明:你有一個類型爲arrayList的arrayList。由於您的外部arrayList爲空,因此您需要首先添加arrayList,然後才能將整數值添加到內部arrayList

1

該方法消除了對get呼叫的需要。

import java.util.ArrayList; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); 

     for(int i = 0;i < 10; ++i) 
     { 
      ArrayList<Integer> b = new ArrayList<Integer>(); 
      a.add(b); 

      for(int j = 0; j < 10; ++j) 
      { 
       b.add(j); 
      } 
     } 
    } 
} 
相關問題