Elméleti alapozás
Java-nyelv néhány összetett adattípusa
Tömb
A tömb összetett adattípusként a legegyszerűbben fogalmazva egy tárolóobjektum. Benne mindenféle egyszerű típusú adatot, értékét vagy akár már összetett típusú objektumokat is tárolhatunk (akár több dimenzióban is). Számunkra programozás-technikailag nem érdekes, hogy a tárolás módja:
-
közvetlen-e (konkrét memóriafoglalás),
-
vagy közvetett (ekkor a tömb nem konkrét memóriahelyeket foglal le, hanem csak az eltárolt adatok memóriacímeit tárolja el).
Az bizonyos, hogy egyszerű adattípusok esetén közvetlen, objektumok tárolása esetén pedig közvetett, azaz memóriacímes adattárolás történik.
Mivel a tömb maga is objektum, ezért ilyen módon is kell létrehozni; ennek szabványos módja a new parancs kiadása.
Kezdjük egyszerű adattípusú tömbök vizsgálatával! Hozzunk létre egy integer típusú, 5 elemből álló tömböt:
int[] tomb = new int[5];
Ekkor a tömb 5 db int típusú szám fogadására és tárolására lesz képes.
A kapcsos zárójelek helyzete a deklaráció első részében kétféle lehet, mindkettő működő megoldás:
int tomb[] = new int[5];
int[] tomb = new int[5];
Egyéb szintaktika -főként a tömbméret megadásánál-, szintén lényeges, mert ha nem pontos, az Eclipse hibákat fog jelezni:
-
nem adhatunk meg nem egész méretű tömbnagyságot:
-
int tomb[] = new int[3.14];
-
-
nem adhatunk meg tömbnagyságként negatív számot:
-
int tomb[] = new int[-5];
-
-
nem adhatunk meg nem értelmezhető méretű tömbnagyságot:
-
int tomb[] = new int[]; ← nincs értelmezhető szám
-
int tomb[] = new int[a*b]; - a és b nem értelmezhető, ha nincs integerként (int) deklarálva vagy a és b nem integer.
-
Viszont a tömbméretezés képes matematikai műveleteket befogadni, ha annak végértéke szintén integer (int):
int a = 3;
int b = 4;
int tomb[] = new int[a*b]; //Végeredmény: [12]
int tomb[] = new int[Math.pow(3)]; //Végeredmény: [9]
int a = 3;
int tomb[] = new int[Math.pow(a)]; //Végeredmény: [9]
A deklaráció szigorú követelményeinek egyetlen kivétele a tömb neve (itt tomb), amely a szokásos névadási konvenciók figyelembevételével bármi lehet.
Ekkor tehát egy x elemű tárolóobjektum jön létre, amelyet a Java még automatikusan inicializál is 0 kezdőértékekkel. Amint azt az összetett típusú adattárolásnál megszokhattuk, az indexelés mindig 0-nál kezdődik és n-1-nél végződik, ahol n a tömb megadott mérete.
A tömbműveletek mindig bonyolultak, mert szekvenciális utasítással eléggé nehézkes (és sokszor nem célszerű) a tömb minden egyes eleméhez hozzáférnünk:
public class Main {
public static void main(String[] args) {
int[] tomb = new int[5];
System.out.print(tomb[0] + " " +
tomb[1] + " " + tomb[2] + " " + tomb[3] + " " + tomb[4]);
}
}
Végeredmény:
0 0 0 0 0
Ezért a tömbtartalom teljes vizsgálatához az optimális módszer az iterálás (for ciklus).
public class Main {
public static void main(String[] args) {
int[] tomb = new int[5];
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i] + " ");
}
}
}
Végeredmény:
0 0 0 0 0
Láthatjuk, hogy a Java a tömböt automatikusan valóban 0 értékekkel inicializálta.
Természetesen a tömböt előre megadott értékekkel is létrehozhatunk...
public class Main {
public static void main(String[] args) {
int[] tomb = new int[]{2, 5, 9, 120,
34};
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i] + " ");
}
}
}
Végeredmény:
2, 5, 9, 120, 34
...illetve objektumok létrehozása esetén is működik (itt String):
public class Main {
public static void main(String[] args) {
String[] tomb = new String[]{"Cirbolya",
" és ", "Borbolya"};
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i]);
}
}
}
Végeredmény:
Cirbolya és Borbolya
Van lehetőség a tömb reinicializálásra is. Az alábbi példában a "Cirbolya" string helyére "Füles" kerül:
public class Main {
public static void main(String[] args) {
String[] tomb = new String[]{"Cirbolya",
" és ", "Borbolya"};
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i]);
}
System.out.println();
tomb[0] = "Füles";
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i]);
}
}
}
Végeredmény:
Cirbolya és Borbolya
Füles és Borbolya