Matrices de copia de Java (utilizando el sistema arraycopy (), construcción de bucle, etc.)

En este tutorial, aprenderá sobre las diferentes formas que puede utilizar para copiar matrices (tanto unidimensionales como bidimensionales) en Java con la ayuda de ejemplos.

En Java, podemos copiar una matriz en otra. Existen varias técnicas que puede utilizar para copiar matrices en Java.

1. Copia de matrices mediante el operador de asignación

Tomemos un ejemplo

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Salida :

 1, 2, 3, 4, 5, 6

En el ejemplo anterior, hemos utilizado el operador de asignación ( =) para copiar una matriz denominada números a otra matriz denominada números positivos.

Esta técnica es la más sencilla y también funciona. Sin embargo, existe un problema con esta técnica. Si cambiamos elementos de una matriz, los elementos correspondientes de las otras matrices también cambian. Por ejemplo,

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays // change value of first array numbers(0) = -1; // printing the second array for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Salida :

 -1, 2, 3, 4, 5, 6

Aquí, podemos ver que hemos cambiado un valor de la matriz de números. Cuando imprimimos la matriz de números positivos, podemos ver que también se cambia el mismo valor.

Es porque ambas matrices se refieren al mismo objeto de matriz. Esto se debe a la copia superficial. Para obtener más información sobre la copia superficial, visite copia superficial.

Ahora, para crear nuevos objetos de matriz mientras copia las matrices, necesitamos una copia profunda en lugar de una copia superficial.

2. Uso de la construcción de bucle para copiar matrices

Tomemos un ejemplo:

 import java.util.Arrays; class Main ( public static void main(String() args) ( int () source = (1, 2, 3, 4, 5, 6); int () destination = new int(6); // iterate and copy elements from source to destination for (int i = 0; i < source.length; ++i) ( destination(i) = source(i); ) // converting array to string System.out.println(Arrays.toString(destination)); ) )

Salida :

 (1, 2, 3, 4, 5, 6)

En el ejemplo anterior, hemos utilizado el forbucle para recorrer cada elemento de la matriz fuente. En cada iteración, estamos copiando elementos de la matriz de origen a la matriz de destino.

Aquí, la matriz de origen y destino se refiere a diferentes objetos (copia profunda). Por lo tanto, si se cambian los elementos de una matriz, los elementos correspondientes de otra matriz no se modifican.

Note la declaración,

 System.out.println(Arrays.toString(destination));

Aquí, el método toString () se usa para convertir una matriz en una cadena. Para obtener más información, visite el método toString () (documentación oficial de Java).

3. Copiar matrices con el método arraycopy ()

En Java, la clase System contiene un método denominado arraycopy()para copiar matrices. Este método es un mejor enfoque para copiar matrices que los dos anteriores.

El arraycopy()método le permite copiar una parte específica de la matriz de origen en la matriz de destino. Por ejemplo,

 arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

Aquí,

  • src - matriz de origen que desea copiar
  • srcPos - posición inicial (índice) en la matriz fuente
  • dest - matriz de destino donde los elementos se copiarán de la fuente
  • destPos - posición inicial (índice) en la matriz de destino
  • longitud - número de elementos para copiar

Tomemos un ejemplo:

 // To use Arrays.toString() method import java.util.Arrays; class Main ( public static void main(String() args) ( int() n1 = (2, 3, 12, 4, 12, -2); int() n3 = new int(5); // Creating n2 array of having length of n1 array int() n2 = new int(n1.length); // copying entire n1 array to n2 System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); // copying elements from index 2 on n1 array // copying element to index 1 of n3 array // 2 elements will be copied System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); ) )

Salida :

 n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)

En el ejemplo anterior, hemos utilizado el arraycopy()método,

  • System.arraycopy(n1, 0, n2, 0, n1.length) - los elementos completos de la matriz n1 se copian en la matriz n2
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 elementos de la matriz n1 a partir del índice 2 se copian en el índice a partir de 1 de la matriz n3

Como puede ver, el valor inicial predeterminado de los elementos de una matriz de tipo int es 0.

4. Copiar matrices con el método copyOfRange ()

También podemos usar el método copyOfRange () definido en la clase Java Arrays para copiar arreglos. Por ejemplo,

 // To use toString() and copyOfRange() method import java.util.Arrays; class ArraysCopy ( public static void main(String() args) ( int() source = (2, 3, 12, 4, 12, -2); // copying entire source array to destination int() destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); // copying from index 2 to 5 (5 is not included) int() destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); ) )

Salida

 destino1 = (2, 3, 12, 4, 12, -2) destino2 = (12, 4, 12)

En el ejemplo anterior, observe la línea,

 int() destination1 = Arrays.copyOfRange(source, 0, source.length);

Aquí, podemos ver que estamos creando la matriz de destino1 y copiando la matriz de origen al mismo tiempo. No estamos creando la matriz destination1 antes de llamar al copyOfRange()método. Para obtener más información sobre el método, visite Java copyOfRange.

5. Copiar matrices 2d usando Loop

De manera similar a la matriz unidimensional, también podemos copiar la matriz bidimensional utilizando el forbucle. Por ejemplo,

 import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); int()() destination = new int(source.length)(); for (int i = 0; i < destination.length; ++i) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); for (int j = 0; j < destination(i).length; ++j) ( destination(i)(j) = source(i)(j); ) ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Salida :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

En el programa anterior, observe la línea,

 System.out.println(Arrays.deepToString(destination);

Aquí, el deepToString()método se utiliza para proporcionar una mejor representación de la matriz bidimensional. Para obtener más información, visite Java deepToString ().

Copiando matrices 2d usando arraycopy ()

Para hacer el código anterior más simple, podemos reemplazar el bucle interno con System.arraycopy()como en el caso de una matriz unidimensional. Por ejemplo,

 import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); int()() destination = new int(source.length)(); for (int i = 0; i < source.length; ++i) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); System.arraycopy(source(i), 0, destination(i), 0, destination(i).length); ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Salida :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

Aquí, podemos ver que obtenemos el mismo resultado reemplazando el forciclo interno con el arraycopy()método.

Articulos interesantes...