Copie arrays 2D en Java

Waleed 12 octubre 2023
  1. Uso de la iteración de bucle para copiar un array 2D en Java
  2. Usando el método clone() para copiar un array 2D en Java
  3. Uso del método arraycopy() para copiar un array 2D en Java
Copie arrays 2D en Java

Cada vez que intentamos copiar elementos del array 2D a otro array, a menudo asignamos un array original a el array de destino. Por qué este enfoque es lógicamente incorrecto, lo discutiremos primero.

Aunque la solución que se menciona a continuación es lógicamente incorrecta, queremos hacerle saber por qué esta solución no funciona.

// Java Program to copy 2-dimensional array
// create 2D array
int[][] arr1 = {{2, 4, 6}, {8, 10, 12}};
// creating the same array with the same size
int[][] arr2 = new int[arr1.length];
// this code does not copy elements of arr1[ ] to arr2[ ] because arr2[ ] sill refer to the same
// location
arr2 = arr1;

Cuando escribimos arr2=arr1, estamos asignando a arr2[ ] una referencia a arr1[ ]. Por lo tanto, el cambio de un array se reflejará tanto en el array copiada como en la original porque ambas matrices apuntan a la misma ubicación.

Para demostrar este hecho, eche un vistazo al código que se muestra a continuación.

// A Java program to demonstrate assigning an array reference doesn't make any sense

public class copy2DArray {
  public static void main(String[] args) {
    // Create an array arr1[]
    int[][] arr1 = {{2, 4, 5}, {6, 8, 10}};
    // Create an array arr2[] with the same size
    int[][] arr2 = new int[arr1.length][];
    // Doesn't copy elements of arr1 to arr2, but only arr2 starts refering arr1
    arr2 = arr1;
    // Any changing in the arr2 also reflects in the arr1 because
    // both are referin to the same location
    arr2[0][0] = 88;
    System.out.println("Elements of arr1[] are:");
    for (int i = 0; i < arr1.length; i++) {
      for (int j = 0; j < arr1.length; j++) {
        System.out.println(arr1[i][j] + " ");
      }
    }
    System.out.println("\n\nElements of arr2[] are:");
    for (int i = 0; i < arr2.length; i++) {
      for (int j = 0; j < arr2.length; j++) {
        System.out.println(arr2[i][j] + " ");
      }
    }
  }
}

Producción :

Elements of arr1[] are:
88
4
6
8
Elements of arr2[] are:
88
4
6
8

En el ejemplo anterior, hemos discutido los errores comunes que los desarrolladores suelen cometer al copiar elementos del array 2D. Ahora discutiremos el método correcto para realizar la misma tarea.

En Java, podemos copiar elementos del array usando los siguientes métodos:

  1. Iterar todos los elementos de un array y copiar cada elemento.
  2. Utilizando el método clone().
  3. Usando el método arraycopy().

Uso de la iteración de bucle para copiar un array 2D en Java

Técnica de iteración de bucle para copiar un array 2D. Al usar este método, experimentará que cualquier modificación del array original o de destino no afectará un array original. Por lo tanto, el array original permanece intacta.

// A Java program to demonstrate assigning an array reference doesn't make any sense
import java.util.Arrays;
public class copy2DArray {
  public static void main(String[] args) {
    // Create an array arr1[ ]
    int[][] arr1 = {{2, 4, 5}, {6, 8, 10}};
    // Create an array arr2[ ] with the same size
    int[][] arr2 = new int[arr1.length][];
    // Copying elements of arr1[ ] to arr2[ ]
    for (int i = 0; i < arr1.length; i++) {
      // allocation space to each row of arr2[]
      arr2[i] = new int[arr1[i].length];
      for (int j = 0; j < arr1[i].length; j++) {
        arr2[i][j] = arr1[i][j];
      }
    }

    // Any change in the elements of arr2[ ] will not be reflected  in an original array
    arr2[0][0] = 90;
    System.out.println("Elements of arr1[] are:");
    for (int i = 0; i < arr1.length; i++) {
      for (int j = 0; j < arr1[0].length; j++) {
        System.out.println(arr1[i][j] + " ");
      }
    }
    System.out.println("\n\nElements of arr2[] are:");
    for (int i = 0; i < arr2.length; i++) {
      for (int j = 0; j < arr2[0].length; j++) {
        System.out.println(arr2[i][j] + " ");
      }
    }
  }
}

Producción :

Elements of arr1[] are:
2 
4
5 
6 
8
10 
Elements of arr2[] are:
90 
4 
5 
6 
8 
10

Usando el método clone() para copiar un array 2D en Java

Usamos la técnica de iteración de bucle para copiar elementos del array 2D en el método anterior. Podemos hacer la misma tarea con el método clone().

// A Java program to demonstrate assigning an array reference doesn't make any sense

import java.util.Arrays;
public class copy2DArray {
  public static void main(String[] args) {
    // Create an array arr1[]
    int[][] arr1 = {{2, 4, 5}, {6, 8, 10}};
    // Create an array arr2[] with the same size
    int[][] arr2 = new int[arr1.length][];
    // Copying elements of arr1[ ] to arr2[ ] using the clone() method
    for (int i = 0; i < arr1.length; i++) arr2[i] = arr1[i].clone();
    // Any change in the elements of arr2[] will not be reflected in an original array
    arr2[0][0] = 90;
    System.out.println("Elements of arr1[] are:");
    for (int i = 0; i < arr1.length; i++) {
      for (int j = 0; j < arr1[0].length; j++) {
        System.out.println(arr1[i][j] + " ");
      }
    }
    System.out.println("\n\nElements of arr2[] are:");
    for (int i = 0; i < arr2.length; i++) {
      for (int j = 0; j < arr2[0].length; j++) {
        System.out.println(arr2[i][j] + " ");
      }
    }
  }
}

Producción :

Elements of arr1[] are:
2 
4
5 
6 
8
10 
Elements of arr2[] are:
90 
4 
5 
6 
8 
10

Uso del método arraycopy() para copiar un array 2D en Java

Asimismo, podemos copiar arrays 2D utilizando el método arraycopy(). Podemos copiar elementos de cualquier arreglo 2D sin iterar todos los elementos del arreglo con este método. Para usar este método, necesitamos proporcionar los siguientes parámetros:

  • src: array fuente que necesita copiar
  • srcPos: ubicación inicial del array original.
  • dest: array de destino.
  • destPos: índice inicial del array de destino.
  • length: número total de elementos del array 2D que queremos copiar

Excepción:

  • NullPointerException: si el array de origen o de destino no está definida o no existe.
  • ArrayStoreException: si un desarrollador intenta copiar un tipo del array entera en un array de cadena, esta situación activa automáticamente esta excepción.

Ejemplo:

package sampleProject;
import java.util.Arrays;
public class Codesample {
  public static void main(String[] args) {
    // Create an array arr1[]
    int[][] arr1 = {{2, 4, 5}, {6, 8, 10}};
    // Create an array arr2[] with the same size
    int[][] arr2 = new int[arr1.length][];
    // Copying elements of arr1[] to arr2[] using the clone() method
    for (int i = 0; i < arr1.length; i++) {
      arr2[i] = new int[arr1[i].length];
      System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[i].length);
    }
    // Any change in the elements of arr2[] will not be reflected in an original array
    arr2[0][0] = 90;
    System.out.println("Elements of arr1[] are:");
    for (int i = 0; i < arr1.length; i++) {
      for (int j = 0; j < arr1[0].length; j++) {
        System.out.println(arr1[i][j] + " ");
      }
    }
    System.out.println("\n\nElements of arr2[] are:");
    for (int i = 0; i < arr2.length; i++) {
      for (int j = 0; j < arr2[0].length; j++) {
        System.out.println(arr2[i][j] + " ");
      }
    }
  }
}

Producción :

Elements of arr1[] are:
2 
4
5 
6 
8
10 
Elements of arr2[] are:
90 
4 
5 
6 
8 
10

Artículo relacionado - Java Array