V tomto tutoriáli sa dozviete o rôznych spôsoboch, ako môžete pomocou príkladov kopírovať polia (jednorozmerné aj dvojrozmerné) v Jave.
V Jave môžeme kopírovať jedno pole do druhého. Existuje niekoľko techník, ktoré môžete použiť na kopírovanie polí v Jave.
1. Kopírovanie polí pomocou operátora priradenia
Zoberme si príklad,
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ýstup :
1, 2, 3, 4, 5, 6
Vo vyššie uvedenom príklade sme použili operátor priradenia ( =
) na skopírovanie poľa s názvom čísla do iného poľa s názvom positiveNumbers.
Táto technika je najjednoduchšia a funguje tiež. S touto technikou však nastáva problém. Ak zmeníme prvky jedného poľa, zmenia sa aj zodpovedajúce prvky ostatných polí. Napríklad,
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ýstup :
-1, 2, 3, 4, 5, 6
Tu vidíme, že sme zmenili jednu hodnotu poľa čísel. Keď vytlačíme pole positiveNumbers, vidíme, že sa zmení aj rovnaká hodnota.
Je to preto, lebo obe polia odkazujú na rovnaký objekt poľa. Je to tak kvôli plytkej kópii. Ak sa chcete dozvedieť viac o plytkej kópii, navštívte plytkú kópiu.
Teraz, aby sme počas kopírovania polí mohli vytvárať nové objekty poľa, potrebujeme radšej hĺbkovú kópiu ako plytkú kópiu.
2. Použitie Looping Construct na kopírovanie polí
Uveďme si príklad:
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ýstup :
(1, 2, 3, 4, 5, 6)
Vo vyššie uvedenom príklade sme použili for
slučku na iteráciu cez každý prvok zdrojového poľa. V každej iterácii kopírujeme prvky zo zdrojového poľa do cieľového poľa.
Tu sa zdrojové a cieľové pole vzťahuje na rôzne objekty (hlboká kópia). Ak sa teda zmenia prvky jedného poľa, zodpovedajúce prvky iného poľa sa nezmenia.
Všimnite si vyhlásenie,
System.out.println(Arrays.toString(destination));
Tu sa metóda toString () používa na prevod poľa na reťazec. Ak sa chcete dozvedieť viac, navštívte metódu toString () (oficiálna dokumentácia Java).
3. Kopírovanie polí pomocou metódy arraycopy ()
V prostredí Java trieda System obsahuje metódu pomenovanú arraycopy()
na kopírovanie polí. Táto metóda je lepším prístupom k kopírovaniu polí ako vyššie uvedené dva.
arraycopy()
Metóda umožňuje kopírovať špecifikovanú časť zdrojového poľa do cieľového poľa. Napríklad,
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Tu,
- src - zdrojové pole, ktoré chcete kopírovať
- srcPos - východisková pozícia (index) v zdrojovom poli
- cieľ - cieľové pole, kde budú prvky kopírované zo zdroja
- destPos - východisková pozícia (index) v cieľovom poli
- dĺžka - počet prvkov na kopírovanie
Uveďme si príklad:
// 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ýstup :
n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)
Vo vyššie uvedenom príklade sme použili arraycopy()
metódu,
System.arraycopy(n1, 0, n2, 0, n1.length)
- celé prvky z poľa n1 sa skopírujú do poľa n2System.arraycopy(n1, 2, n3, 1, 2)
- 2 prvky poľa n1 počnúc indexom 2 sa skopírujú do indexu začínajúceho od 1 poľa n3
Ako vidíte, predvolená počiatočná hodnota prvkov poľa typu int je 0.
4. Kopírovanie polí pomocou metódy copyOfRange ()
Na kopírovanie polí môžeme tiež použiť metódu copyOfRange () definovanú v triede Java Arrays. Napríklad,
// 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ýkon
cieľ1 = (2, 3, 12, 4, 12, -2) cieľ2 = (12, 4, 12)
Vo vyššie uvedenom príklade si všimnite riadok,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Tu vidíme, že vytvárame pole destination1 a súčasne do neho kopírujeme zdrojové pole. Pred zavolaním copyOfRange()
metódy nevytvárame pole destination1 . Ak sa chcete dozvedieť viac informácií o tejto metóde, navštívte stránku Java copyOfRange.
5. Kopírovanie 2D polí pomocou slučky
Podobne ako v jednorozmernom poli môžeme aj pomocou for
slučky kopírovať 2-rozmerné pole . Napríklad,
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ýstup :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Vo vyššie uvedenom programe si všimnite riadok,
System.out.println(Arrays.deepToString(destination);
Tu sa deepToString()
metóda používa na lepšie znázornenie dvojrozmerného poľa. Ak sa chcete dozvedieť viac, navštívte Java deepToString ().
Kopírovanie 2D polí pomocou arraycopy ()
Aby sme vyššie uvedený kód zjednodušili, môžeme nahradiť vnútornú slučku System.arraycopy()
ako v prípade jednorozmerného poľa. Napríklad,
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ýstup :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Tu vidíme, že rovnaký výstup dostaneme nahradením vnútornej for
slučky arraycopy()
metódou.