Java - Kopiranje nizova


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



Kopiranje nizova pomoću operatora dodjeljivanja

Pogledajmo primjer:

class Main {
    public static void main(String[] args) {
       
        int [ ] numbers = {1, 2, 3, 4, 5, 6};
        int [ ] positiveNumbers = numbers;    // kopiranje niza

        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

U gornjem primjeru koristili smo operator dodjele (=) za kopiranje niza imenovanih brojevima u drugi niz nazvan positiveNumbers. Ova je tehnika najlakša i djeluje. Međutim, postoji problem s ovom tehnikom. Ako promijenimo elemente jednog polja, 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;    // kopiranje niza
      
        // promjena vrijednosti prvog niza
        numbers[0] = -1;

        // ispisivanje drugogo niza
        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

Ovdje možemo vidjeti da smo promijenili jednu vrijednost niza brojeva. Kada ispisujemo niz positiveNumbers, možemo vidjeti da se ista vrijednost takođe mijenja. To je zato što se oba niza odnose na isti objekt niza. To je zbog plitke kopije. O ovome ćemo pričati u narednim lekcijama. Sada, za izradu novih objekata niza tokom kopiranja nizova, potrebna nam je dubinska kopija, a ne plitka kopija.



Korištenje konstrukcije petlje za kopiranje nizova

Pogledajmo 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];

        // ponavljanje i kopiranje elemenata od izvora do odredišta
        for (int i = 0; i < source.length; ++i) {
            destination[i] = source[i];
        }
      
         // Konvertuje niz u string
        System.out.println(Arrays.toString(destination));
    }
}

U gornjem primjeru koristili smo for petlju za iteraciju 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 niza promijene, odgovarajući elementi drugog niza su ostali 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).



Kopiranje nizova metodom arraycopy()

U Javi, klasa System sadrži metodu nazvanu arraycopy() za kopiranje nizova. Ova metoda je bolji pristup za kopiranje nizova od gore navedena dva. Metoda arraycopy() omogućava kopiranje određenog dijela izvornog niza u odredišni niz. Na primjer:

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

Ovdje je:

  • 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-a) u odredišnom nizu
  • lenght - dužina broja elemenata za kopiranje

Pogledajmo primjer:

// Za korištenje Arrays.toString() metode
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];

        // Stvaranje n2 niza dužine n1 niza
        int[] n2 = new int[n1.length];
      
        // kopiranje cijelog n1 niza u n2
        System.arraycopy(n1, 0, n2, 0, n1.length);
        System.out.println("n2 = " + Arrays.toString(n2));  
      
        // kopiranje elemenata iz indeksa 2 na n1 polje
         // kopiranje elementa u indeks 1 n3 niza
         // 2 elementa će se kopirati
        System.arraycopy(n1, 2, n3, 1, 2);
        System.out.println("n3 = " + Arrays.toString(n3));  
    }
}

U gornjem primjeru koristili smo metodu arraycopy():

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

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



Kopiranje nizova metodom copyOfRange()

Za kopiranje nizova možemo koristiti i metodu copyOfRange() definisanu u klasi Java nizovi. Na primjer:

// Korištenje toString() i copyOfRange() metode
import java.util.Arrays;

class ArraysCopy {
    public static void main(String[] args) {
      
        int[ ] source = {2, 3, 12, 4, 12, -2};
      
        // kopiranje cijelog izvornog niza na odredište
        int[ ] destination1 = Arrays.copyOfRange(source, 0, source.length);      
        System.out.println("destination1 = " + Arrays.toString(destination1)); 
      
        // kopiranje iz indeksa 2 u 5 (5 nije uključeno)
        int[ ] destination2 = Arrays.copyOfRange(source, 2, 5); 
        System.out.println("destination2 = " + Arrays.toString(destination2));   
    }
}

U gornjem primjeru, primijetite red:

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


Kopiranje 2d nizova pomoću petlje

Slično jednodimenzionalnom nizu, takođe možemo kopirati dvodimenzionalni niz pomoću for petlje. 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) {

            // dodjeljivanje prostora za svaki red odredišnog niza
            destination[i] = new int[source[i].length];

            for (int j = 0; j < destination[i].length; ++j) {
                destination[i][j] = source[i][j];
            }
        }
     
        // prikaz odredišnog niza
        System.out.println(Arrays.deepToString(destination));  
      
    }
}

U gornjem programu, primijetite red:

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

Ovdje se metoda deepToString() koristi za pružanje boljeg prikaza dvodimenzionalnog niza. Da biste saznali više, posjetite deepToString().



Kopiranje 2d nizova pomoću arraycopy()

Da bismo gornji kod učinili jednostavnijim, unutrašnju 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) {

             // dodjeljivanje prostora za svaki red odredišnog niza
             destination[i] = new int[source[i].length];
             System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
        }
     
        // prikaz odredišnog niza
        System.out.println(Arrays.deepToString(destination));      
    }
}

Ovdje možemo vidjeti da isti rezultat dobivamo zamjenom unutrašnje for petlje metodom arraycopy().