Còpia de matriu en Java

Còpia de matriu en Java

Donada una matriu, hem de copiar els seus elements en una matriu diferent, a un usuari ingenu, la manera següent ve a la ment que, però, és incorrecta, tal com es mostra a continuació:

// Java Program to Illustrate Wrong Way Of Copying an Array // Input array int a[] = { 1, 8, 3 }; // Creating an array b[] of same size as a[] int b[] = new int[a.length]; // Doesn't copy elements of a[] to b[], only makes // b refer to same location b = a; 

Sortida:

Explicació de la sortida: Quan fem b = a, en realitat estem assignant una referència a la matriu. Per tant, si fem algun canvi a una matriu, també es reflectirà en altres matrius perquè tant a com b es refereixen a la mateixa ubicació. També podem verificar-ho amb el codi com es mostra a continuació de la següent manera:

Exemple:

Java




// A Java program to demonstrate that simply> // assigning one array reference is incorrect> public> class> Test {> > public> static> void> main(String[] args)> > {> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Doesn't copy elements of a[] to b[],> > // only makes b refer to same location> > b = a;> > > // Change to b[] will also reflect in a[]> > // as 'a' and 'b' refer to same location.> > b[> 0> ]++;> > > System.out.println(> 'Contents of a[] '> );> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); System.out.println(' Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }>

Sortida

Contents of a[] 2 8 3 Contents of b[] 2 8 3 

Mètodes:

Hem vist el funcionament intern mentre es copiaven elements i casos extrems que s'han de tenir en compte després de superar els errors generats anteriorment, de manera que ara podem proposar maneres correctes de copiar la matriu tal com s'enumeren a continuació de la següent manera:

  1. Iterant cada element de la matriu original donada i copiant un element a la vegada
  2. Utilitzant el mètode clone().
  3. Utilitzant el mètode arraycopy().
  4. Utilitzant el mètode copyOf() de la classe Arrays
  5. Utilitzant el mètode copyOfRange() de la classe Arrays

Mètode 1: Iterant cada element de la matriu original donada i copiant un element a la vegada. Amb l'ús d'aquest mètode, garanteix que qualsevol modificació a b no alterarà la matriu original a, tal com es mostra a l'exemple següent:

Exemple:

Java




// Java program to demonstrate copying by> // one by one assigning elements between arrays> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Input array a[]> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Copying elements of a[] to b[]> > for> (> int> i => 0> ; i b[i] = a[i]; // Changing b[] to verify that // b[] is different from a[] b[0]++; // Display message only System.out.println('Contents of a[] '); for (int i = 0; i System.out.print(a[i] + ' '); // Display message only System.out.println(' Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }>

Sortida

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Mètode 2: Utilitzant el mètode Clone().

En el mètode anterior havíem d'iterar per tota la matriu per fer una còpia, podem fer-ho millor? Sí, podem utilitzar el mètode de clonació a Java.

Exemple:

Java




// Java program to demonstrate Copying of Array> // using clone() method> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Input array a[]> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Copying elements of a[] to b[]> > int> b[] = a.clone();> > > // Changing b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > // Display message for better readability> > System.out.println(> 'Contents of a[] '> );> > > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Display message for better readability System.out.println(' Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }>

Sortida

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Mètode 3: Utilitzant el mètode arraycopy().

També podem utilitzar System.arraycopy() Mètode. El sistema està present al paquet java.lang. La seva signatura és la següent:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

Paràmetres:

  • src denota la matriu font.
  • srcPos és l'índex des del qual comença la còpia.
  • començar indica la matriu de destinació
  • destPos és l'índex des del qual es col·loquen els elements copiats a la matriu de destinació.
  • llargada és la longitud de la subbarra que s'ha de copiar.

Exemple:

Java




// Java program to demonstrate array> // copy using System.arraycopy()> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Creating an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Copying elements of a[] to b[]> > System.arraycopy(a,> 0> , b,> 0> ,> 3> );> > > // Changing b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > // Display message only> > System.out.println(> 'Contents of a[] '> );> > > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Display message only System.out.println(' Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }>

Sortida

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Mètode 4: Utilitzant el mètode copyOf() de la classe Arrays

Si volem copiar els primers elements d'una matriu o una còpia completa de la matriu, podeu utilitzar aquest mètode.

Sintaxi:

public static int[] copyOf?(int[] original, int newLength) 

Paràmetres:

  • Matriu original
  • Longitud de la matriu a copiar.

Exemple:

Java




// Java program to demonstrate array> // copy using Arrays.copyOf()> > // Importing Arrays class from utility class> import> java.util.Arrays;> > // Main class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > // Copy elements of a[] to b[]> > int> b[] = Arrays.copyOf(a,> 3> );> > > // Change b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > System.out.println(> 'Contents of a[] '> );> > > // Iterating over array. a[]> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); System.out.println(' Contents of b[] '); // Iterating over array b[] for (int i = 0; i System.out.print(b[i] + ' '); } }>

Sortida

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Mètode 5: Utilitzant el mètode copyOfRange() de la classe Arrays

Aquest mètode copia l'interval especificat de la matriu especificada en una matriu nova.

public static int[] copyOfRange?(int[] original, int from, int to) 

Paràmetres:

  • Matriu original de la qual s'ha de copiar un interval
  • Índex inicial de l'interval a copiar
  • Índex final de l'interval a copiar, exclusiu

Exemple:

Java




// Java program to demonstrate array> // copy using Arrays.copyOfRange()> > // Importing Arrays class from utility package> import> java.util.Arrays;> > // Main class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> ,> 5> ,> 9> ,> 10> };> > > // Creating an array b[] and> > // copying elements of a[] to b[]> > int> b[] = Arrays.copyOfRange(a,> 2> ,> 6> );> > > // Changing b[] to verify that> > // b[] is different from a[]> > > // Iterating over array a[]> > System.out.println(> 'Contents of a[] '> );> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Iterating over array b[] System.out.println(' Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }>

Sortida

Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10 

Finalment, anem a discutir visió general dels mètodes anteriors:

  • Simplement assignar referències és incorrecte
  • La matriu es pot copiar iterant sobre una matriu i un per un assignant elements.
  • Podem evitar la iteració sobre elements utilitzant clone() o System.arraycopy()
  • clone() crea una nova matriu de la mateixa mida, però System.arraycopy() es pot utilitzar per copiar d'un interval d'origen a un interval de destinació.
  • System.arraycopy() és més ràpid que clone() ja que utilitza la interfície nativa de Java
  • Si voleu copiar els primers elements d'una matriu o una còpia completa d'una matriu, podeu utilitzar el mètode Arrays.copyOf().
  • Arrays.copyOfRange() s'utilitza per copiar un interval especificat d'una matriu. Si l'índex inicial no és 0, podeu utilitzar aquest mètode per copiar una matriu parcial.