Java Copy Arrays (Utilizarea sistemului arraycopy (), construirea în buclă și așa mai departe)

În acest tutorial, veți afla despre diferite moduri pe care le puteți utiliza pentru a copia tablouri (atât unidimensionale, cât și bidimensionale) în Java cu ajutorul exemplelor.

În Java, putem copia o matrice în alta. Există mai multe tehnici pe care le puteți utiliza pentru a copia matricele în Java.

1. Copierea matricilor utilizând Operatorul de atribuire

Să luăm un exemplu,

 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 + ", "); ) ) )

Ieșire :

 1, 2, 3, 4, 5, 6

În exemplul de mai sus, am folosit operatorul de atribuire ( =) pentru a copia un tablou numit numere într-un alt tablou numit positiveNumbers.

Această tehnică este cea mai ușoară și funcționează la fel. Cu toate acestea, există o problemă cu această tehnică. Dacă schimbăm elemente dintr-o matrice, se schimbă și elementele corespunzătoare ale celorlalte tablouri. De exemplu,

 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 + ", "); ) ) )

Ieșire :

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

Aici, putem vedea că am schimbat o valoare a matricei de numere. Când imprimăm matricea positiveNumbers, putem vedea că aceeași valoare este, de asemenea, modificată.

Acest lucru se datorează faptului că ambele matrice se referă la același obiect matrice. Acest lucru se datorează copiei superficiale. Pentru a afla mai multe despre copierea superficială, accesați copia superficială.

Acum, pentru a crea obiecte matrice noi în timpul copierii matricelor, avem nevoie de o copiere profundă, mai degrabă decât de o copie superficială.

2. Folosirea Looping Construct pentru a copia matrice

Să luăm un exemplu:

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

Ieșire :

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

În exemplul de mai sus, am folosit forbucla pentru a itera prin fiecare element al matricei sursă. În fiecare iterație, copiem elemente din matricea sursă în matricea destinație.

Aici, matricea sursă și destinație se referă la diferite obiecte (copiere profundă). Prin urmare, dacă elementele dintr-o matrice sunt modificate, elementele corespunzătoare ale unei alte matrice sunt neschimbate.

Observați declarația,

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

Aici, metoda toString () este utilizată pentru a converti o matrice într-un șir. Pentru a afla mai multe, vizitați metoda toString () (documentație oficială Java).

3. Copierea matricelor folosind metoda arraycopy ()

În Java, clasa System conține o metodă numită arraycopy()pentru a copia tablouri. Această metodă este o abordare mai bună pentru a copia tablourile decât cele două de mai sus.

arraycopy()Metoda vă permite să copiați o porțiune specificată de matrice sursă pentru matrice de destinație. De exemplu,

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

Aici,

  • src - matrice sursă pe care doriți să o copiați
  • srcPos - poziția de pornire (index) în matricea sursă
  • dest - matrice de destinație în care elementele vor fi copiate de la sursă
  • destPos - poziția de pornire (index) în matricea de destinație
  • lungime - numărul de elemente de copiat

Să luăm un exemplu:

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

Ieșire :

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

În exemplul de mai sus, am folosit arraycopy()metoda,

  • System.arraycopy(n1, 0, n2, 0, n1.length) - elemente întregi din tabloul n1 sunt copiate în tabloul n2
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 elemente ale tabloului n1 pornind de la indexul 2 sunt copiate la index pornind de la 1 din tabloul n3

După cum puteți vedea, valoarea inițială implicită a elementelor dintr-o matrice de tip int este 0.

4. Copierea matricelor utilizând metoda copyOfRange ()

De asemenea, putem folosi metoda copyOfRange () definită în clasa Java Arrays pentru a copia matrice. De exemplu,

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

Ieșire

 destinație1 = (2, 3, 12, 4, 12, -2) destinație2 = (12, 4, 12)

În exemplul de mai sus, observați linia,

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

Aici, putem vedea că creăm matricea destination1 și copiem matricea sursă în același timp. Nu creăm matricea destination1 înainte de a apela copyOfRange()metoda. Pentru a afla mai multe despre metodă, vizitați Java copyOfRange.

5. Copierea matricilor 2d folosind bucla

Similar cu matricea unidimensională, putem copia și matricea bidimensională folosind forbucla. De exemplu,

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

Ieșire :

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

În programul de mai sus, observați linia,

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

Aici, deepToString()metoda este utilizată pentru a oferi o reprezentare mai bună a matricei bidimensionale. Pentru a afla mai multe, vizitați Java deepToString ().

Copierea matricilor 2d folosind arrayycopy ()

Pentru a face codul de mai sus mai simplu, putem înlocui bucla interioară cu System.arraycopy()ca în cazul unui tablou unidimensional. De exemplu,

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

Ieșire :

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

Aici, putem vedea că obținem aceeași ieșire înlocuind forbucla interioară cu arraycopy()metoda.

Articole interesante...