Ebben az oktatóanyagban megismerkedhet a Java tömbök (egy- és kétdimenziós) másolásának különböző módjaival a példák segítségével.
A Java-ban az egyik tömböt átmásolhatjuk a másikba. Számos technika használható a tömbök másolására Java-ban.
1. Tömbök másolása a Assignment Operator segítségével
Vegyünk egy példát,
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 + ", "); ) ) )
Kimenet :
1, 2, 3, 4, 5, 6
A fenti példában a hozzárendelés operátorral ( =
) másoltunk egy számokat tartalmazó tömböt egy másik pozitívNumbers nevű tömbbe.
Ez a technika a legkönnyebb és működik is. Ezzel a technikával azonban van egy probléma. Ha megváltoztatjuk az egyik tömb elemeit, akkor a többi tömb megfelelő elemei is megváltoznak. Például,
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 + ", "); ) ) )
Kimenet :
-1, 2, 3, 4, 5, 6
Itt láthatjuk, hogy megváltoztattuk a számtömb egyik értékét. A pozitívNumbers tömb kinyomtatásakor láthatjuk, hogy ugyanaz az érték is megváltozik.
Ez azért van, mert mindkét tömb ugyanazon tömb objektumra vonatkozik. Ennek oka a sekély másolat. Ha többet szeretne megtudni a sekély másolatról, keresse fel a sekély példányt.
Ahhoz, hogy új tömb objektumokat készítsünk a tömbök másolása közben, mélységes másolásra van szükségünk, nem pedig sekély másolásra.
2. A Looping Construct használata a tömbök másolásához
Vegyünk egy példát:
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)); ) )
Kimenet :
(1, 2, 3, 4, 5, 6)
A fenti példában a for
ciklust alkalmaztuk a forrás tömb minden egyes elemének iterációjára. Minden iterációban elemeket másolunk a forrás tömbből a cél tömbbe.
Itt a forrás és a cél tömb különböző objektumokra utal (mély másolat). Ezért, ha egy tömb elemeit megváltoztatják, a másik tömb megfelelő elemei nem változnak.
Figyelje meg az állítást,
System.out.println(Arrays.toString(destination));
Itt a toString () metódust használjuk egy tömb átalakítására karakterlánnyá. További információért keresse fel a toString () metódust (hivatalos Java dokumentáció).
3. Tömbök másolása arraycopy () módszerrel
A Java-ban a System osztály tartalmaz egy metódust arraycopy()
a tömbök másolására. Ez a módszer jobb megközelítést jelent a tömbök másolásánál, mint a fenti kettő.
A arraycopy()
módszer lehetővé teszi a forrás tömb egy meghatározott részének másolását a cél tömbbe. Például,
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Itt,
- src - a másolni kívánt forrás tömb
- srcPos - kezdő pozíció (index) a forrás tömbben
- dest - rendeltömb, ahová az elemeket átmásoljuk a forrásból
- destPos - kiindulási helyzet (index) a céltömbben
- length - a másolandó elemek száma
Vegyünk egy példát:
// 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)); ) )
Kimenet :
n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)
A fenti példában a arraycopy()
módszert használtuk ,
System.arraycopy(n1, 0, n2, 0, n1.length)
- az n1 tömb teljes elemeit átmásoljuk az n2 tömbbeSystem.arraycopy(n1, 2, n3, 1, 2)
- Az n1 tömb 2 elemét a 2. indexből kiindulva az n3 tömb 1-től kezdve átmásoljuk az indexbe
Mint látható, az int típusú tömb elemeinek alapértelmezett kezdeti értéke 0.
4. Tömbök másolása a copyOfRange () módszerrel
A tömbök másolásához használhatjuk a Java Arrays osztályban definiált copyOfRange () metódust is. Például,
// 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)); ) )
Kimenet
rendeltetési hely1 = (2, 3, 12, 4, 12, -2) cél2 = (12, 4, 12)
A fenti példában vegye észre a sort,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Itt láthatjuk, hogy egyidejűleg létrehozzuk a destination1 tömböt és átmásoljuk a forrás tömböt. Nem a cél1 tömböt hozzuk létre a copyOfRange()
metódus meghívása előtt . Ha többet szeretne megtudni a módszerről, látogasson el a Java copyOfRange oldalra.
5. 2d tömbök másolása a hurok használatával
Az egydimenziós tömbhöz hasonlóan a for
hurok segítségével másolhatjuk a 2-dimenziós tömböt is . Például,
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)); ) )
Kimenet :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5)
A fenti programban vegye észre a sort,
System.out.println(Arrays.deepToString(destination);
Itt a deepToString()
módszert a kétdimenziós tömb jobb ábrázolásának biztosítására használják. További információkért látogasson el a Java deepToString () oldalra.
2d tömbök másolása tömbmásolat használatával ()
A fenti kód egyszerűbbé tétele érdekében a belső hurkot lecserélhetjük, System.arraycopy()
mint az egydimenziós tömb esetében. Például,
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)); ) )
Kimenet :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5)
Itt láthatjuk, hogy ugyanazt a kimenetet kapjuk, ha a belső for
hurkot a arraycopy()
módszerrel helyettesítjük.