2016-10-09 31 views
0

任務是將2維數組轉換爲簡單數組,然後嘗試通過for循環將原始數組的元素複製到新數組中數組索引出現在for循環中,每次有2個元素

public static void main(String[] args) { 
    int[][] a = new int[5][8]; 
    //initialize the 2-dimensional array with random number range(1~100) 
    assignNestedArray(a); 
    printNestedArray(a); 
    int[] arr=new int[a.length*a[0].length]; 
    for(int i=0,k=0;i<a.length;++i,k+=a[i].length){ 
     System.arraycopy(a[i], 0, arr, k, a[i].length);   
    } 
    System.out.println(Arrays.toString(arr)); 
} 

public static void printNestedArray(int[][] a){ 
    for (int[] sub_arr : a) { 
     for (int v : sub_arr) 
      System.out.print(v+" "); 
     System.out.println(); 
    } 
} 

public static void assignNestedArray(int[][] a){ 
    for (int i = 0; i < a.length; ++i) 
     for (int j = 0; j < a[i].length; ++j) 
      a[i][j] = (int) (Math.random() * 100); 
} 

其示出了數組索引越界異常 exception

的另一方面,如果我修改數組複製這樣的代碼:

for(int i=0,k=0;i<a.length;++i){ 
     System.arraycopy(a[i], 0, arr, k, a[i].length); 
     k+=a[i].length; 
    } 

它運行良好,我不知道這兩個代碼之間有什麼區別,以及如何編寫每次更新2個元素的for循環。 任何意見是感謝,謝謝。

+2

閱讀錯誤。你試圖訪問索引5的行。你只有5行,所以索引只能到4. – Carcigenicate

+0

你是對的,我只是忽略for循環的執行過程的順序,它似乎是增量我先被執行了,而k的增量只會導致異常。 – LancelotHolmes

回答

1

修改您的循環。你首先遞增「我」,然後遞增k,所以當我== 4它再次遞增我將是5,你會比訪問一個會拋出ArrayIndexOutOfBoundsException的[5]。

 for (int i = 0, k = 0; i < a.length; k += a[i].length,++i) { 
      System.arraycopy(a[i], 0, arr, k, a[i].length); 
     } 
+0

謝謝,你是對的,這就是我需要的,這讓我想起for循環的執行過程 – LancelotHolmes