2009-11-06 32 views
37

tengo una matriz 2D llamada matriz de tipo int que yo quiero copiar a una variable local en un método para que pueda editarlocopiar una matriz 2D en Java

cuál es la mejor manera de copiar la matriz, i estoy teniendo algunas dificultades

por ejemplo

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

Algunos problemas. . ¿¿qué exactamente?? –

Respuesta

5

no está inicializando la matriz 2D local.

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

Hay dos buenas maneras de copiar matriz es utilizar clon y System.arraycopy().

Aquí es cómo utilizar clon para el caso 2D:

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

Para System.arraycopy(), que utilice:

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

que no tienen un punto de referencia pero puede apostar con mi 2 centavos que son más rápidos y menos propenso a errores que hacerlo tú mismo. Especialmente, System.arraycopy() ya que está implementado en código nativo.

Espero que esto ayude.

Editar: error reparado.

+5

Arrays.copyOf() también se puede utilizar –

+1

Pete tiene razón. Pero Arrays.copyOf() hace uso de System.arraycopy() con un exceso para asumir que la longitud del resultado puede no ser la misma que la original. En este caso, sabemos con certeza el tamaño del resultado, por lo que es mucho más eficiente usar clone() y System.arraycopy() ya que son nativos. No obstante, Arrays.copyOf() también se puede usar. – NawaMan

+0

@PeteKirkham Arrays.copyOf() no copia profundamente una matriz 2d. Simplemente se refiere a las mismas matrices de 2da dimensión. –

-10

puede codificar así también myInt = matrix.clone();

+6

Eso creará una matriz que comparta las matrices de fila como el original –

10

Es posible utilizar flujos en Java 8 para copiar una matriz 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

Para una sola línea: contraiga todas las lambdas para las referencias de métodos 'Arrays.stream (data) .map (int [] :: clone) .toArray (int [] [ ] :: new); 'Pero tenga en cuenta que para arreglos enormes, System.arraycopy nativo debería ser (¿probablemente?) más rápido, a menos que' paralelo() 'su secuencia. – NIA

Cuestiones relacionadas