V tej vadnici boste s pomočjo primerov spoznali različne načine kopiranja nizov (tako enodimenzionalnih kot dvodimenzionalnih) v Javi.
V Javi lahko kopiramo eno matriko v drugo. Za kopiranje nizov v Javi lahko uporabite več tehnik.
1. Kopiranje nizov s pomočjo Operatorja dodelitve
Vzemimo primer,
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 + ", "); ) ) )
Izhod :
1, 2, 3, 4, 5, 6
V zgornjem primeru smo z operatorjem dodelitve ( =
) kopirali polje z imeni števil v drugo polje z imenom positiveNumbers.
Ta tehnika je najlažja in tudi deluje. Vendar pa s to tehniko obstaja težava. Če spremenimo elemente enega polja, se spremenijo tudi ustrezni elementi drugih nizov. Na primer
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 + ", "); ) ) )
Izhod :
-1, 2, 3, 4, 5, 6
Tu lahko vidimo, da smo spremenili eno vrednost matrike števil. Ko natisnemo matriko positiveNumbers, lahko vidimo, da se spremeni tudi ista vrednost.
To je zato, ker se obe matriki nanašata na isti objekt polja. To je zaradi plitve kopije. Če želite izvedeti več o plitvi kopiji, obiščite plito kopijo
Zdaj za izdelavo novih objektov matrike med kopiranjem nizov potrebujemo globoko kopiranje in ne plitve kopije.
2. Uporaba zanke Construct za kopiranje nizov
Vzemimo primer:
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)); ) )
Izhod :
(1, 2, 3, 4, 5, 6)
V zgornjem primeru smo for
zanko uporabili za iteracijo skozi vsak element izvorne matrike. V vsaki ponovitvi kopiramo elemente iz izvorne matrike v ciljno matriko.
Tu se izvorna in ciljna matrika nanašata na različne predmete (globoka kopija). Če se elementi enega polja spremenijo, se ustrezni elementi drugega polja spremenijo.
Upoštevajte izjavo,
System.out.println(Arrays.toString(destination));
Tu se za pretvorbo polja v niz uporablja metoda toString (). Če želite izvedeti več, obiščite metodo toString () (uradna dokumentacija Java).
3. Kopiranje nizov z uporabo metode arraycopy ()
V Javi razred System vsebuje metodo, imenovano arraycopy()
za kopiranje nizov. Ta metoda je boljši pristop za kopiranje nizov kot zgornja dva.
arraycopy()
Metoda omogoča kopiranje določen del izvorne matrike v ciljni matriki. Na primer
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Tukaj,
- src - izvorno polje, ki ga želite kopirati
- srcPos - začetni položaj (indeks) v izvorni matriki
- dest - ciljna matrika, kjer bodo elementi kopirani iz vira
- destPos - začetni položaj (indeks) v ciljni matriki
- dolžina - število elementov za kopiranje
Vzemimo primer:
// 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)); ) )
Izhod :
n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)
V zgornjem primeru smo uporabili arraycopy()
metodo,
System.arraycopy(n1, 0, n2, 0, n1.length)
- celotni elementi iz matrike n1 se kopirajo v matriko n2System.arraycopy(n1, 2, n3, 1, 2)
- 2 elementa polja n1, začenši z indeksom 2, se kopirata v indeks, začenši z 1 polja n3
Kot lahko vidite, je privzeta začetna vrednost elementov matrike int tipa 0.
4. Kopiranje nizov z uporabo metode copyOfRange ()
Za kopiranje nizov lahko uporabimo tudi metodo copyOfRange (), določeno v razredu Java Arrays. Na primer
// 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)); ) )
Izhod
cilj1 = (2, 3, 12, 4, 12, -2) cilj2 = (12, 4, 12)
V zgornjem primeru upoštevajte vrstico,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Tu lahko vidimo, da ustvarjamo matriko target1 in istočasno kopiramo vanj matriko. Pred klicanjem copyOfRange()
metode ne ustvarjamo matrike1 . Če želite izvedeti več o metodi, obiščite Java copyOfRange.
5. Kopiranje 2d nizov z uporabo zanke
Podobno kot pri enodimenzionalnem polju lahko tudi z uporabo for
zanke prekopiramo dvodimenzionalno polje . Na primer
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)); ) )
Izhod :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
V zgornjem programu upoštevajte vrstico,
System.out.println(Arrays.deepToString(destination);
Tu se deepToString()
metoda uporablja za boljšo predstavitev dvodimenzionalne matrike. Če želite izvedeti več, obiščite Javo deepToString ().
Kopiranje 2d nizov z uporabo arraycopy ()
Za poenostavitev zgornje kode lahko notranjo zanko nadomestimo s System.arraycopy()
tako kot v primeru enodimenzionalne matrike. Na primer
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)); ) )
Izhod :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Tu lahko vidimo, da dobimo enak izhod z zamenjavo notranje for
zanke z arraycopy()
metodo.