2014-05-21 211 views
0

我嘗試1D轉換爲二維數組,但我不斷收到java.lang.ArrayIndexOutOfBoundsException,我曾嘗試一切我能找到的計算器或互聯網,但我不明白爲什麼我有這個問題?轉換1D到2D java.lang.ArrayIndexOutOfBoundsException

public class Arrayto2DArray { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     int[] a = {0,1, 6, 83, 4, 5, 12, 7}; 
     int[][] b = new int[4][4]; 

      for (int i = 0; i < b.length; i++) { 
      for (int j = 0; j < b[i].length; j++) { 
       b[i][j]=0; 
       System.out.print(b[i][j]); 
      } 
      System.out.println(); 
      } 

     System.out.println("--------------------------"); 


     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < b[i].length; j++) { 
       try{ 
       b[i][j] = a[i+j*4]; 
       }catch(Exception e){ 
        e.printStackTrace(); 
        System.out.println(e); 
       } 
      } 
     } 

     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 4; j++) { 
       System.out.print(b[i][j]); 
      } 
       System.out.println(); 
     }  
    } 
} 

我種的,知道爲什麼我得到這個錯誤,因爲這條線

b[i][j] = a[i+j*4]; 

的,但我不能想出比這更好的任何公式。

+0

改變你使用不同的代碼???當我複製它並試圖從問題運行代碼時,我從'b [i] .length'(第一個內部循環)得到了'NullPointerException'。我甚至在運行程序之前就預料到了這一點,因爲'new int [4] []'創建與下面的代碼相同的數組:'new int [] [] {null,null,null,null}' – fabian

回答

2

考慮for循環 可以說,當i = 3且j = 3 a[i+j*4]的計算結果爲a[15]這超出陣列的

當聲明你2-d陣列的第二,指定int[][] b = new int[4][];,意義由於b[i].length沒有預定義的長度,因此第一個for循環for (int j = 0; j < b[i].length; j++)應該會導致NullPointerException。在插入內部for循環之前,應該定義每個b [i]的大小,如b[i] = new int[somenumber]

關於將1d循環轉換爲2d,您需要定義圍繞將其分割爲二維數組的規則。然後相應的第二個循環需要修改

編輯:你修改你的代碼有一個int [4] [4]數組,這意味着你有16個佔位符。你的一維數組只包含8個佔位符。它取決於你想要如何對數組進行排序,如它可以是

b 0 1 2 3 
0 0 1 6 83 
1 4 5 12 7 
2 0 0 0 0 
3 0 0 0 0 

或任何其他圖案

假設1-d陣列的長度是8和2-d陣列的總索引是16,以下是更多的一般解決方案:

public static void main(String[] args) { 
     // TODO code application logic here 
     int[] a = { 0, 1, 6, 83, 4, 5, 12, 7 }; 
     int[][] b = new int[4][4]; 

     for (int i = 0; i < b.length; i++) { 
      for (int j = 0; j < b[i].length; j++) { 
       b[i][j] = 0; 
       System.out.print(b[i][j] + "\t"); 
      } 
      System.out.println(); 
     } 

     System.out.println("--------------------------"); 

     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < b[i].length; j++) { 
       try { 
        if ((j + i * 4) < a.length) 
         b[i][j] = a[j + i * 4]; 
       } catch (Exception e) { 
        e.printStackTrace(); 
        System.out.println(e); 
       } 
      } 
     } 

     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 4; j++) { 
       System.out.print(b[i][j] + "\t"); 
      } 
      System.out.println(); 
     } 
    } 
+0

正如我所說我知道了,但我怎麼能有更好的公式來避免這個問題? –

+0

我注意到你更新了你的問題與已知的罪魁禍首..你必須告訴我們你的第二回路 – Ashish

+0

的目標是什麼?哪個罪魁禍首? –

0

你的正確公式應該是這樣的。

int[] a = {0,1, 6, 83, 4, 5, 12, 7}; 
int[][] b = new int[4][2]; 

int k=0; 
for (int i = 0; i < b.length; i++) { // Column of 2D array 
    for (int j = 0; j < b[0].length; j++) { // Row of 2D array 
     b[i][j]= a[k++]; 
     System.out.println(b[i][j]); 
    } 
} 

編輯:

對於一般情況下,如果行是固定的,在4列,但不固定比你的二維變換式應該是這樣的下方。

int col = a.length/4; 
    int remainder = a.length % 4; 
    if (remainder > 0) { 
     col = col + 1; // Get the correct column size. 
    } 
    int[][] b = new int[4][col]; 
    int k = 0; 
    for (int i = 0; i < 4; i++) { 
     for (int j = 0; j < col; j++) { 
      if (k < a.length) { 
       b[i][j] = a[k]; 
       System.out.println(b[i][j]); 
      } 
      k++; 
     } 
    } 
+0

爲什麼不是4乘4?我已經找到了。它適用於你所說的,但現在對我的情況。 –

+1

您的一維數組大小爲8,因此4,4大小是多餘的,4,2大小足以從數組'a []'中獲取所有值。 – Masudul

+0

什麼是一般情況? –

0

什麼錯誤是您的2D陣列是一個4 * 4,因此,這意味着對於每個指數,將有4個元素,即說值。所以總共有16個值,所以你需要一個包含16個元素的1D數組來處理上面的代碼。現在你的1D數組只有8個值。

+0

所以要麼按照Masud的回答,要麼改變你的一維數組有16個元素,例如int [] a = {0,1,6,83,4,5,12,7,4,5,12,7,4,5, 12,7}; – cptdanko

+0

我做了,但出來是有點重演。 –

+0

這是一個如何使4X4二維數組與你的代碼一起工作的例子。該數組可以包含您放入1D數組中的任何數字。如果你想使用你已經得到的一維數組,你可以按照Masud的回答。 – cptdanko

0

我覺得你的代碼應該是這樣

public class Arrayto2DArray { 


    public static void main(String[] args) { 
     // TODO code application logic here 
     int[] a = {0,1, 6, 83, 4, 5, 12, 7}; 
     int[][] b = new int[4][2]; 

      for (int i = 0; i < b.length; i++) { 
      for (int j = 0; j < b[i].length; j++) { 
       b[i][j]=0; 
       System.out.print(b[i][j]); 
      } 
      System.out.println(); 
      } 

     System.out.println("--------------------------"); 


     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < b[i].length; j++) { 
       try{ 

        b[i][j] = a[i+j*4]; 
       }catch(Exception e){ 
        e.printStackTrace(); 
        System.out.println(e); 
       } 
      } 
     } 

     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 2; j++) { 
       System.out.print(b[i][j]+" "); 
      } 
       System.out.println(); 
     }  
    } 
} 
+0

不,我得到相同的錯誤 –

+0

沒有我測試過它保存代碼並重新運行它。 –

+0

複製並粘貼我編輯過的全班............... –