Java kopirni nizovi (Korištenje sistemske arraycopy (), konstrukcije petlje i tako dalje)

U ovom ćete uputstvu uz primjere naučiti o različitim načinima na koje možete kopirati nizove (i jednodimenzionalne i dvodimenzionalne) u Javi.

U Javi možemo kopirati jedan niz u drugi. Postoji nekoliko tehnika koje možete koristiti za kopiranje nizova u Javi.

1. Kopiranje nizova pomoću operatora dodjele

Uzmimo primjer,

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

Izlaz :

 1, 2, 3, 4, 5, 6

U gornjem primjeru koristili smo operator dodjeljivanja ( =) za kopiranje niza s brojevima u drugi niz s imenom positiveNumbers.

Ova je tehnika najlakša i također djeluje. Međutim, postoji problem s ovom tehnikom. Ako promijenimo elemente jednog niza, mijenjaju se i odgovarajući elementi ostalih polja. Na primjer,

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

Izlaz :

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

Ovdje možemo vidjeti da smo promijenili jednu vrijednost niza brojeva. Kada ispisujemo niz positiveNumbers, možemo vidjeti da se mijenja i ista vrijednost.

To je zato što se oba polja odnose na isti objekt niza. To je zbog plitke kopije. Da biste saznali više o plitkoj kopiji, posjetite plitku kopiju.

Sada, za izradu novih objekata niza tijekom kopiranja nizova, potrebna nam je dubinska kopija, a ne plitka kopija.

2. Korištenje konstrukcije petlje za kopiranje nizova

Uzmimo primjer:

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

Izlaz :

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

U gornjem primjeru koristili smo forpetlju za itiranje kroz svaki element izvornog niza. U svakoj iteraciji kopiramo elemente iz izvornog niza u odredišni niz.

Ovdje se izvorni i odredišni niz odnose na različite objekte (dubinska kopija). Dakle, ako se elementi jednog polja promijene, odgovarajući elementi drugog polja ostaju nepromijenjeni.

Primijetite izjavu,

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

Ovdje se metoda toString () koristi za pretvaranje niza u niz. Da biste saznali više, posjetite metodu toString () (službena Java dokumentacija).

3. Kopiranje nizova metodom arraycopy ()

U Javi klasa System sadrži metodu imenovanu arraycopy()za kopiranje nizova. Ova metoda je bolji pristup kopiranju nizova od gornja dva.

arraycopy()Metoda omogućuje kopiranje određenog dijela izvornog polja na odredište polje. Na primjer,

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

Ovdje,

  • src - izvorni niz koji želite kopirati
  • srcPos - početna pozicija (indeks) u izvornom nizu
  • dest - odredišni niz u kojem će se elementi kopirati iz izvora
  • destPos - početna pozicija (indeks) u odredišnom nizu
  • duljina - broj elemenata za kopiranje

Uzmimo primjer:

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

Izlaz :

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

U gornjem primjeru koristili smo arraycopy()metodu,

  • System.arraycopy(n1, 0, n2, 0, n1.length) - čitavi elementi iz n1 niza kopiraju se u n2 niz
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 elementa n1 niza počevši od indeksa 2 kopiraju se u indeks počevši od 1 n3 niza

Kao što vidite, zadana početna vrijednost elemenata niza tipa int je 0.

4. Kopiranje nizova metodom copyOfRange ()

Za kopiranje nizova možemo koristiti i metodu copyOfRange () definiranu u klasi Java Arrays. Na primjer,

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

Izlaz

 odredište1 = (2, 3, 12, 4, 12, -2) odredište2 = (12, 4, 12)

U gornjem primjeru, primijetite redak,

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

Ovdje možemo vidjeti da istovremeno stvaramo polje destination1 i u njega kopiramo izvorni niz. Ne stvaramo polje destination1 prije pozivanja copyOfRange()metode. Da biste saznali više o metodi, posjetite Java copyOfRange.

5. Kopiranje 2d nizova pomoću petlje

Slično jednodimenzionalnom nizu, također možemo kopirati dvodimenzionalni niz pomoću forpetlje. Na primjer,

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

Izlaz :

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

U gornjem programu, primijetite redak,

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

Ovdje se deepToString()metoda koristi za bolji prikaz dvodimenzionalnog niza. Da biste saznali više, posjetite Javu deepToString ().

Kopiranje 2d nizova pomoću arraycopy ()

Da bismo gornji kod učinili jednostavnijim, unutarnju petlju možemo zamijeniti System.arraycopy()kao u slučaju jednodimenzionalnog niza. Na primjer,

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

Izlaz :

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

Ovdje možemo vidjeti da isti rezultat dobivamo zamjenom unutarnje forpetlje arraycopy()metodom.

Zanimljivi članci...