Selles õpetuses saate teada näidete abil erinevatest viisidest, kuidas saate Java-massiivide (nii ühemõõtmeliste kui ka kahemõõtmeliste) kopeerimist.
Java-s saame kopeerida ühe massiivi teise. Massiivide kopeerimiseks Java-s saate kasutada mitut tehnikat.
1. Massiivide kopeerimine määranguoperaatori abil
Võtame näite,
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 + ", "); ) ) )
Väljund :
1, 2, 3, 4, 5, 6
Ülaltoodud näites oleme =
massi nimega massiivi teisele massiivile nimega positiivsedNumbrid kopeerinud määranguoperaatorit ( ).
See tehnika on kõige lihtsam ja töötab ka. Kuid selle tehnikaga on probleem. Kui muudame ühe massiivi elemente, muutuvad ka teiste massiivide vastavad elemendid. Näiteks,
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 + ", "); ) ) )
Väljund :
-1, 2, 3, 4, 5, 6
Siin näeme, et oleme muutnud arvude massiivi ühte väärtust. Massiivi pozitívNumbers printimisel näeme, et muudetakse ka sama väärtust.
Sellepärast, et mõlemad massiivid viitavad samale massiivi objektile. Selle põhjuseks on madal koopia. Madalama koopia kohta lisateabe saamiseks külastage pindmist koopiat.
Nüüd, massiivide kopeerimise ajal uute massiiviobjektide valmistamiseks vajame pigem sügavat kui madalat koopiat.
2. Massiivide kopeerimiseks kontuuri ehitamine
Võtame näite:
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)); ) )
Väljund :
(1, 2, 3, 4, 5, 6)
Ülaltoodud näites oleme for
tsüklit kasutanud lähtemassiivi iga elemendi itereerimiseks. Igas iteratsioonis kopeerime elemente lähtemassiivist sihtmassiivi.
Siin viitavad lähte- ja sihtmassiiv erinevatele objektidele (sügav koopia). Seega, kui ühe massiivi elemente muudetakse, siis teise massiivi vastavaid elemente ei muudeta.
Pange tähele avaldust,
System.out.println(Arrays.toString(destination));
Siin kasutatakse massiivi stringiks teisendamiseks meetodit toString (). Lisateabe saamiseks külastage meetodit toString () (ametlik Java dokumentatsioon).
3. Massiivide kopeerimine arraycopy () meetodi abil
Javas sisaldab süsteemiklass arraycopy()
massiivide kopeerimiseks nimetatud meetodit . See meetod on parem viis massiivide kopeerimiseks kui kaks ülaltoodud.
arraycopy()
Meetod võimaldab teil kopeerida kindlaksmääratud osa allikas massiivi sihtkohta massiiv. Näiteks,
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Siin,
- src - lähtemassiiv, mille soovite kopeerida
- srcPos - lähtepositsioon (indeks) lähtemassiivis
- dest - sihtkoha massiiv, kuhu elemendid allikast kopeeritakse
- destPos - lähtepositsioon (indeks) sihtmassiivis
- pikkus - kopeeritavate elementide arv
Võtame näite:
// 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)); ) )
Väljund :
n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)
Ülaltoodud näites oleme kasutanud arraycopy()
meetodit,
System.arraycopy(n1, 0, n2, 0, n1.length)
- kogu n1 massiivi elemendid kopeeritakse massiivi n2System.arraycopy(n1, 2, n3, 1, 2)
- 2 n1 massiivi elementi alates indeksist 2 kopeeritakse indeksisse alates n3 massiivi 1-st
Nagu näete, on int-tüüpi massiivi elementide vaikimisi algväärtus 0.
4. Massiivide kopeerimine copyOfRange () meetodi abil
Massiivide kopeerimiseks võime kasutada ka Java Arrays klassis määratletud meetodit copyOfRange (). Näiteks,
// 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)); ) )
Väljund
sihtkoht1 = (2, 3, 12, 4, 12, -2) sihtkoht2 = (12, 4, 12)
Ülaltoodud näites märkake rida,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Siit näeme, et loome massiit1 sihtkohta ja kopeerime sinna lähte massiivi. Enne copyOfRange()
meetodi kutsumist me ei loo massiivi destination1 . Meetodi kohta lisateabe saamiseks külastage Java copyOfRange.
5. 2d massiivi kopeerimine Loopi abil
Sarnaselt ühemõõtmelise massiiviga saame ka kahemõõtmelise massiivi kopeerida for
silmuse abil. Näiteks,
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)); ) )
Väljund :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Pange tähele ülaltoodud programmis rida,
System.out.println(Arrays.deepToString(destination);
Siin kasutatakse deepToString()
meetodit kahemõõtmelise massiivi paremaks esitamiseks. Lisateabe saamiseks külastage Java deepToString ().
2d massiivi kopeerimine massiivkoopia () abil
Eespool toodud koodi lihtsamaks muutmiseks võime sisemise silmuse asendada System.arraycopy()
nagu ühemõõtmelise massiivi puhul. Näiteks,
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)); ) )
Väljund :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Siin näeme, et sama väljundi saame, asendades sisemise for
silmuse arraycopy()
meetodiga.