Elméleti alapozás
Java-nyelv néhány összetett adattípusa
Kérdés - Lehet-e tömböt másolni?
Egy tömb másolásakor több probléma is felmerülhet:
-
egyeztetnünk kell a tömbök, illetve elemeinek típusait,
-
egyeztetnünk kell a tömbök méreteit.
Ha ezt nem tesszük meg, a másolás során vagy adatvesztés léphet fel, vagy a művelet egyéb hibaüzenetek formájában végre sem hajtható. A problémát a Java-rendszermérnökei is észrevették, ezért azonnal bevethető kódegységet, metódust építettek be a java.lang.System osztályba arraycopy() néven. Ebben a metódusban...
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
...a következő paramétereket kell beállítanunk a korrekt tömbmásoláshoz:
-
src − forrástömb,
-
srcPos − kezdő pozíció a forrástömbben, innen kezdődik a másolás,
-
dest − céltömb,
-
destPos − kezdő pozíció a céltömbben,
-
length − a másolandó elemek száma.
A metódus a következő kivételeket dobhatja:
-
IndexOutOfBoundsException − ha a másolás során valahol tömbindexhatár átlépése következik be,
-
ArrayStoreException − ha a forrástömb valamelyik eleme nem tárolható a céltömbben (például nem egyezik a típusuk),
-
NullPointerException − ha a forrástömb vagy céltömb referenciája null érték.
A metódus vizsgálatához nézzünk meg egy futtatható Java-kódot. Vegyük észre, hogy a metódushoz közvetlenül fértünk hozzá, azaz nem kellett importálnunk az őt tartalmazó System osztályt:
public class Main {
public static void main(String[] args) {
int forrasTomb[] = { 1, 2, 3, 4, 5 };
int celTomb[] = { 10, 20, 30, 40, 50 };
System.arraycopy(forrasTomb, 0, celTomb, 0, 5);
for(int i = 0; i < celTomb.length;
i++) {
System.out.print(celTomb[i] + " ");
}
}
}
Végeredmény:
1 2 3 4 5
Jól láthatjuk, hogy a forrasTomb tartalma a celTomb nevű tömbbe átkerült. Nézzük meg a tömbtartalom kiírását foreach ciklussal is:
public class Main {
public static void main(String[] args) {
int forrasTomb[] = { 1, 2, 3, 4, 5 };
int celTomb[] = { 10, 20, 30, 40, 50 };
System.arraycopy(forrasTomb, 0, celTomb, 0, 5);
for(int i : celTomb) {
System.out.print(i);
}
}
}
Végeredmény:
1 2 3 4 5