2016-10-09 1 views
0

die Mission ist es, ein 2-dimensionales Array in ein einfaches Array zu konvertieren und ich versuche, das Element des ursprünglichen Array zum neuen Array zum Beispiel für for-Schleife zu kopierenArray-Index außerhalb der Grenzen in for-Schleife mit 2 Elementen jedes Mal

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

, die außerhalb der Grenzen Ausnahme exception

auf der anderen Seite einen Array-Index zeigt, wenn ich die Array Kopie Code wie folgt ändern:

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

Es funktioniert gut, ich frage mich, was ist der Unterschied zwischen diesen beiden Codes und wie man eine for-Schleife mit 2 Elementen jedes Mal zu aktualisieren. Jeder Rat ist zu schätzen, danke.

+2

Lesen Sie den Fehler. Sie versuchen, auf die Zeile mit Index 5 zuzugreifen. Sie haben nur 5 Zeilen, also gehen die Indizes nur zu 4. – Carcigenicate

+0

Sie haben Recht, ich ignoriere einfach die Reihenfolge des Ausführprozesses der for-Schleife, es scheint das Inkrement von mir wurde zuerst ausgeführt und das Inkrement von k verursacht nur die Ausnahme. – LancelotHolmes

Antwort

1

Ändern Sie Ihre Schleife. Sie inkrementieren zuerst "i" und dann inkrementieren Sie k, wenn i == 4 ist, inkrementiert es erneut i, was 5 ist, und Sie erhalten dann Zugriff auf a [5], was ArrayIndexOutOfBoundsException auslöst.

 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

Danke, du hast Recht, das ist was ich brauche, und das erinnert mich an den excute-Prozess der for-Schleife – LancelotHolmes

Verwandte Themen