2009-11-06 38 views
37

ho una matrice 2D chiamata matrice di tipo int che voglio copiare una variabile locale in un metodo così posso modificarlacopiare una matrice 2d in Java

cosa è il modo migliore per copiare l'array, i sto avendo alcuni problemi

ad esempio

int [][] myInt; 
    for(int i = 0; i< matrix.length; i++){ 
     for (int j = 0; j < matrix[i].length; j++){ 
      myInt[i][j] = matrix[i][j]; 
     } 
    } 

    //do some stuff here 
    return true; 
} 
+0

Alcuni problemi. . che cosa esattamente?? –

risposta

5

non sei l'inizializzazione della matrice 2D locale.

int[][] myInt = new int[matrix.length][]; 
for(int i = 0; i < matrix.length; i++) 
{ 
    myInt[i] = new int[matrix[i].length]; 
    for (int j = 0; j < matrix[i].length; j++) 
    { 
    myInt[i][j] = matrix[i][j]; 
    } 
} 
65

Ci sono due buoni modi per copiare l'array è usare clone e System.arraycopy().

Ecco come utilizzare clone per il caso del 2D:

int [][] myInt = new int[matrix.length][]; 
for(int i = 0; i < matrix.length; i++) 
    myInt[i] = matrix[i].clone(); 

Per System.arraycopy(), si utilizza:

int [][] myInt = new int[matrix.length][]; 
for(int i = 0; i < matrix.length; i++) 
{ 
    int[] aMatrix = matrix[i]; 
    int aLength = aMatrix.length; 
    myInt[i] = new int[aLength]; 
    System.arraycopy(aMatrix, 0, myInt[i], 0, aLength); 
} 

non ho un punto di riferimento ma posso scommettere con il mio 2 cent che sono più veloci e meno incline agli errori di farlo da soli. Soprattutto, System.arraycopy() come è implementato nel codice nativo.

Spero che questo aiuti.

Modifica: bug corretto.

+5

Arrays.copyOf() può anche essere utilizzato –

+1

Pete ha ragione. Ma Arrays.copyOf() utilizza System.arraycopy() con un sovraccarico per il presupposto che la lunghezza del risultato potrebbe non essere la stessa dell'originale. In questo caso sappiamo con certezza la dimensione del risultato, quindi è molto più efficiente usare clone() e System.arraycopy() poiché sono nativi. Tuttavia, può essere utilizzato anche Arrays.copyOf(). – NawaMan

+0

@PeteKirkham Arrays.copyOf() non copia in profondità una matrice 2d. Si riferisce solo agli stessi array di seconda dimensione. –

-10

è possibile codificare anche questo myInt = matrix.clone();

+6

Ciò creerà una matrice che condivide gli array di righe come originale –

10

È possibile utilizzare gli stream in Java 8 per copiare un array 2D.

@Test 
public void testCopy2DArray() { 
    int[][] data = {{1, 2}, {3, 4}}; 
    int[][] dataCopy = Arrays.stream(data) 
      .map((int[] row) -> row.clone()) 
      .toArray((int length) -> new int[length][]); 

    assertNotSame(data, dataCopy); 
    assertNotSame(data[0], dataCopy[0]); 
    assertNotSame(data[1], dataCopy[1]); 

    dataCopy[0][1] = 5; 
    assertEquals(2, data[0][1]); 
    assertEquals(5, dataCopy[0][1]); 
} 
+4

Per one-liner: comprimi tutti i lambda ai riferimenti al metodo 'Arrays.stream (data) .map (int [] :: clone) .toArray (int [] [ ] :: new); 'Ma tieni presente che per array enormi, System.arraycopy dovrebbe essere (probabilmente?) più veloce, a meno che tu non sia' parallelo() 'il tuo stream. – NIA