V tomto kurzu se dozvíte o různých způsobech, jak můžete pomocí příkladů kopírovat pole (jednorozměrná i dvourozměrná) v Javě.
V Javě můžeme kopírovat jedno pole do druhého. Existuje několik technik, které můžete použít ke kopírování polí v Javě.
1. Kopírování polí pomocí Assignment Operator
Vezměme si pří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
Ve výše uvedeném příkladu jsme použili operátor přiřazení ( =
) ke zkopírování pole s názvem čísel do jiného pole s názvem positiveNumbers.
Tato technika je nejjednodušší a také funguje. S touto technikou však existuje problém. Pokud změníme prvky jednoho pole, změní se také odpovídající prvky ostatních polí. Napří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
Tady vidíme, že jsme změnili jednu hodnotu pole čísel. Když vytiskneme pole positiveNumbers, vidíme, že se změní také stejná hodnota.
Je to proto, že obě pole odkazují na stejný objekt pole. Je to kvůli mělké kopii. Další informace o mělké kopii najdete na mělké kopii.
Nyní, abychom při kopírování polí vytvořili nové objekty pole, potřebujeme spíše hlubokou kopii než mělkou kopii.
2. Použití Looping Construct ke kopírování polí
Vezměme si pří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)
Ve výše uvedeném příkladu jsme použili for
smyčku k iteraci každým prvkem zdrojového pole. V každé iteraci kopírujeme prvky ze zdrojového pole do cílového pole.
Zde zdrojové a cílové pole odkazuje na různé objekty (hluboká kopie). Pokud se tedy změní prvky jednoho pole, odpovídající prvky jiného pole se nezmění.
Všimněte si prohlášení,
System.out.println(Arrays.toString(destination));
Zde se metoda toString () používá k převodu pole na řetězec. Další informace najdete v metodě toString () (oficiální dokumentace prostředí Java).
3. Kopírování polí metodou arraycopy ()
V Javě třída System obsahuje metodu pojmenovanou arraycopy()
pro kopírování polí. Tato metoda je lepším přístupem ke kopírování polí než výše uvedená dvě.
arraycopy()
Metoda umožňuje kopírovat specifikovanou část zdrojového pole do cílového pole. Například,
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Tady,
- src - zdrojové pole, které chcete kopírovat
- srcPos - výchozí pozice (index) ve zdrojovém poli
- dest - cílové pole, kde budou prvky zkopírovány ze zdroje
- destPos - počáteční pozice (index) v cílovém poli
- délka - počet prvků ke kopírování
Vezměme si pří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)
Ve výše uvedeném příkladu jsme použili arraycopy()
metodu,
System.arraycopy(n1, 0, n2, 0, n1.length)
- celé prvky z pole n1 jsou zkopírovány do pole n2System.arraycopy(n1, 2, n3, 1, 2)
- 2 prvky pole n1 počínaje indexem 2 jsou zkopírovány do indexu začínajícího od 1 pole n3
Jak vidíte, výchozí počáteční hodnota prvků pole typu int je 0.
4. Kopírování polí pomocí metody copyOfRange ()
Ke kopírování polí můžeme také použít metodu copyOfRange () definovanou ve třídě Java Arrays. Napří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ýstup
cíl1 = (2, 3, 12, 4, 12, -2) cíl2 = (12, 4, 12)
Ve výše uvedeném příkladu si všimněte řádku,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Zde vidíme, že vytváříme pole destination1 a současně do něj kopírujeme zdrojové pole. Před voláním copyOfRange()
metody nevytváříme pole destination1 . Další informace o této metodě najdete na webu Java copyOfRange.
5. Kopírování 2D polí pomocí smyčky
Podobně jako v jednorozměrném poli můžeme také pomocí for
smyčky kopírovat dvourozměrné pole . Napří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))
Ve výše uvedeném programu si všimněte řádku,
System.out.println(Arrays.deepToString(destination);
Zde se deepToString()
metoda používá k zajištění lepší reprezentace dvourozměrného pole. Další informace najdete na webu Java deepToString ().
Kopírování 2D polí pomocí arraycopy ()
Aby byl výše uvedený kód jednodušší, můžeme nahradit vnitřní smyčku System.arraycopy()
jako v případě jednorozměrného pole. Napří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))
Zde vidíme, že dostaneme stejný výstup nahrazením vnitřní for
smyčky arraycopy()
metodou.