Gyakorlati alapok III.
Java-nyelv néhány összetett adattípusa
Ó düsszeusz! Nem Hektor, vektor!
Az igazán klasszikus alapokon álló, ógörög invokáció drámai hangon szólította meg a Java egyik érdekes tulajdonságokkal bíró adatszerkezetét, a vektort.
A vektor dinamikus tömböt jelent, tehát automatikus méretváltozása kiküszöböli a statikus méretű tömbök ebbéli, legnagyobb hátrányát. Fontos megjegyeznünk, hogy ha nem rendelkeztünk másképpen, kezdeti mérete 10.
Ezt könnyű ellenőriznünk a capacity() metódusával, amely segítségével lekérdezhetjük egy üres vektor kezdőméretét:
public class
Main{
public static void main(String[] args){
Vector vector = new Vector();
System.out.println(vector.capacity());
}
}
Végeredmény:
10
A fenti vector tárolt elemszáma nyilvánvalóan még 0, ezt a size() metódussal nézzük meg:
public class
Main{
public static void main(String[] args){
Vector vector = new Vector();
System.out.println(vector.size());
}
}
Végeredmény:
0
Ha a kezdeti 10 elemmérettel elégedetlenek volnánk, az ensureCapacity() metódussal (szinte) tetszőleges kezdőméretet állíthatunk be (régebbi dokumentációk initialCapacity() metódusra hivatkoztak):
public class
Main{
public static void main(String[] args){
Vector vector = new Vector();
vector.ensureCapacity(50);
System.out.println(vector.capacity());
}
}
Végeredmény:
50
További előnyei közt említhetjük:
-
amint látható, osztálya rengeteg előre megírt és kiválóan felhasználható karbantartó, kereső, lekérdező, bővítő, törlő, stb. metódust tartalmaz,
-
dinamikus jellege ellenére elemei indexelhetők,
-
többszálú környezetben szinkronizált működésre is képes,
-
osztályában olyan további hasznos metódusok is elérhetők, amelyek nem részei a Java - Kollekció keretrendszernek.
Az alábbi futtatható Java-kódban 1 egyszerű .txt formátumú, fiktív személyi adatokat tartalmazó adatállomány adatait...
szemelyek.txt (4 KB)
...töltjük be Vektor típusú tömbökbe és megnézzük az osztály néhány további alapmetódusának működését. Láthatóan nem kell méretmegadással foglalkoznunk, erről az osztály maga gondoskodik.
Ugyanakkor ügyeljünk a bemeneti fájl pontos elhelyezésére (itt: new FileReader("D:\\szemelyek.txt")), másként kivételekbe fogunk szaladni. A kód alapszerkezete Sike Zoltán informatika tanár oktatóanyagának része.
import java.io.*;
import java.util.Vector;
public class Main {
public static void main(String[] args) {
Vector<String> vezetekNev = new Vector<>();
Vector<String> keresztNev = new Vector<>();
Vector<String> szuletesDatum = new Vector<>();
Vector<String> szuletesHely = new Vector<>();
Vector<Integer> magassag = new Vector<>();
Vector<Integer> suly = new Vector<>();
BufferedReader reader = null;;
try {
reader = new BufferedReader(new
FileReader("D:\\szemelyek.txt"));
String sor;
while (reader.ready()) {
sor =
reader.readLine();
System.out.println(sor);
String[]
sorelemek=sor.split(" ");
vezetekNev.add(sorelemek[0]);
keresztNev.add(sorelemek[1]);
szuletesDatum.add(sorelemek[2]);
szuletesHely.add(sorelemek[3]);
magassag.add(Integer.parseInt(sorelemek[4]));
suly.add(Integer.parseInt(sorelemek[5]));
}
System.out.println();
System.out.print("Vezetéknevek listája: \n");
for (int i = 0; i < vezetekNev.size(); i++) {
System.out.print(vezetekNev.get(i) +
", ");
}
System.out.println();
System.out.print("\nVan-e Róbert keresztnév? ");
System.out.print(keresztNev.contains("Robert") ? "Van" :
"Nincs");
System.out.println();
System.out.println("\nNoémi név a(z) " + keresztNev.indexOf("Noemi")
+ ". indexen található");
System.out.println("\nA szuletesDatum vektortömb kapacitása "
+ szuletesDatum.capacity());
System.out.println();
System.out.println("Gyűjtsük ki a 180-nál nagyobb
testmagasságot: ");
for (int i = 0; i < vezetekNev.size(); i++) {
if(magassag.get(i) > 180){
System.out.print(vezetekNev.get(i) + " " + magassag.get(i) + "\n");
}
}
} catch (FileNotFoundException fnfe) {
System.out.println("A fájl nem
található!");
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if(reader !=
null) {
reader.close();
}
} catch (IOException
ioe) {
System.out.println("A fájl bezárása nem sikerült!");
}
}
}
}
Végeredmény:
Kovacs Bela 1956-01-04 Budapest 185 75
Kiss Zsombor 1980-06-11 Pécel 165 50
Horvath Istvan 1966-12-04 Siofok 180 60
Bognar Jozsef 2002-11-02 Kecskemét 171 54
Kuti David 1959-01-10 Dunakeszi 192 100
Antal Imre 1972-05-10 Csakbereny 178 76
Szekeres Zoltan 1968-05-09 Alsorakos 184 74
Alfoldi Noemi 2012-05-12 Kartal 155 50
Pethes Robert 1964-08-20 Hevízgyork 185 75
Oze Denes 2001-04-21 Diosd 164 56
Vezetéknevek listája:
Kovacs, Kiss, Horvath, Bognar, Kuti, Antal, Szekeres, Alfoldi, Pethes, Oze,
Van-e Róbert keresztnév? Van
Noémi név a(z) 7. indexen található
A szuletesDatum vektortömb kapacitása 10
Gyűjtsük ki a 180-nál nagyobb testmagasságot:
Kovacs 185
Kuti 192
Szekeres 184
Pethes 185
Soroljuk fel a Vektor osztály néhány további hasznos metódusát:
-
Vector(int size) - ez konstruktor függvény előre megadott mérettel építi fel a vektor tömböt,
-
void add(Object element) - vektor tömbelem hozzáadása,
-
int capacity() - vektor tömbméret,
-
void clear() - törli az összes vektor tömbelemet,
-
boolean contains(Object elem) - ellenőrzi, hogy a keresett elem benne van-e vektor tömbben,
-
void copyInto(Object[] anArray) - az összes vektor tömbelemet átmásolja a megadott tömbbe,
-
Object get(int index) - visszaadja a megadott indexen lévő vektor tömbelemet,
-
int indexOf(Object elem) - visszaadja a megadott vektor tömbelem indexszámát,
-
void insertElementAt(Object obj, int index) - vektor tömbelemet helyez be (inzertál) a megadott indexpozícióba,
-
boolean isEmpty() - ellenőrzi, hogy a vektor tömb üres-e,
-
Object lastElement() - visszaadja az utolsó vektor tömbelemet,
-
Object remove(int index) - törli a megadott indexpozícióban lévő vektor tömbelemet,
-
void removeAllElements() - törli az összes vektor tömbelemet és a vektor tömb méretét 0-ra állítja,
-
stb.