OOP: Java 11.Gy: Enumok, beágyazott osztályok 13/1 B ITv: MAN 2019.04.24
ArrayList Rugalmas tömb A tömbök korlátai Fix méret, nem lehet menet közben megnövelni Ha túl nagyra választjuk, fölösleges helyfoglalás Rendezett tömb módosítása Elem beszúrása Elem törlése Keresés a tömbben Végig kell nézni az összes elemet Megoldás: ArrayList, a változtatható méretű tömb 13/2
ArrayList A java.util.arraylist osztályban található Példányosítani kell ArrayList<típus> alist = new ArrayList<típus>(); List<típus> alist = new ArrayList(); Csak burkoló osztály lehet az elemtípusa Integer, Double, Character, Long, Boolean A lista csak és kizárólag referencia típusú adatokat képes tárolni, így primitív típusokat nem rakhatunk bele. Fontos metódusok: add(), size(), get(index), indexof(érték), tostring() remove(érték), set(index, érték), toarray() (elemszám) 13/3
ArrayList Példakód import java.util.arraylist; import java.util.collections; public class ArrListPrb { public static void main(string args[]) { ArrayList<Integer> alist = new ArrayList<Integer>(); for (int i=0; i<8; i++) alist.add( (int)(math.random()*11)-5 ); for (Integer j : alist) System.out.println(j); System.out.println("A lista elemszáma: "+alist.size()); System.out.println("A lista 3. eleme: "+alist.get(2)); System.out.print("Van benne 0 értékű elem? "); int hely = alist.indexof(0); if (hely > -1) System.out.println("Igen, a "+(hely+1)+". helyen"); else System.out.println("Nincs"); 13/4
ArrayList Példakód } System.out.println("Törlöm a legelső elemet!"); alist.remove(0); for (Integer j : alist) System.out.println(j); System.out.println("Törlöm a 0 értékű elemet!"); alist.remove(0); for (Integer j : alist) System.out.println(j); System.out.println("Kicserélem a 2. elemet 10-re!"); alist.set(1,10); for (Integer j : alist) System.out.println(j); System.out.println("A rendezett lista:"); Collections.sort(aList); System.out.println(aList); System.out.println("Berakom az elemeket egy tömbbe"); Integer [] t = new Integer[aList.size()]; t = alist.toarray(t); } 13/5
1. : Egy enum osztály megvalósítható tagosztályként vagy önálló osztályként. Készítsünk Planet enum osztályt (önálló osztályként), amely tartalmazza a bolygókat és az alábbi konstans adataikat (enum konstansok): Az osztálynak ezen felül legyen egy osztályszintű private final adattagja: az egyetemes tömegvonzás konstans (G = 6.67300e-11) és legyen konstruktora. Figyelem! Az enum osztály konstruktora legyen private. Ez automatikusan létrehozza az enum konstansokat, de nem hívható (az enum osztályt nem lehet példányosítani). 13/6
1. : Az osztály metódusai: Írjuk meg az adattagokat lekérdező metódusokat. Számítsuk ki a bolygón a tömegvonzást (double): G * bolygó tömege/(sugár*sugár) Számítsuk ki az egyik bolygón mért tömeget (paraméter) a másik bolygón mérhető tömegre: paraméterként kapott tömeg * tömegvonzás az adott bolygón. 13/7
1. : Készítsünk futtatható osztályt, amelyben felhasználjuk a Planet osztályt. Beolvasunk egy tömeget. Ezt elosztjuk a bolygóra jellemző tömegvonzással. Ezt a tömeget lehet átszámítani másik bolygón mérhető tömegre. Egy enum típus összes tagjának elérése a values() metódussal történik. int earthweight = readint(); double mass = earthweight/planet.earth.surfacegravity(); for (Planet p : Planet.values()) { System.out.printf("Your weight on %s is %f%n", p, p.surfaceweight(mass)); } 13/8
1. : Elmélet: A private konstruktorral rendelkező osztály közvetlenül nempéldányosítható, de a private konstruktor az osztályon belüli public static metódusból hívható. Használatának esetei: a) Enum osztály konstruktora (az osztály nem példányosítható). b) Az osztály csak static tagokat tartalmaz, azaz nem példányosítható. Pl. Math osztály. c) Olyan osztály konstruktora, ahol a példányok számát korlátozni akarjuk (pl. Singleton osztály csak egyszer példányosítható). d) A private konstruktor közös inicializáló kódot tartalmaz, a többi public konstruktor ezt hívja 13/9
2. : Hozzunk létre egy Egyenlet osztályt, azon belül két osztályszintű tagosztályt: Elsőfokú és Másodfokú. Az Elsőfokú tagosztály adattagjai: 2 double változó az elsőfokú egyenlet konstansainak tárolásához; a Másodfokú tagosztály adattagjai: 3 double változó a másodfokú egyenlet konstansainak tárolásához. Készítsük el az osztályok konstruktorait, valamint az adattagok lekérdezését és beállítását megvalósító metódusokat. 13/10
2. : Hozzuk létre az Egyenlet osztály kiterjesztésével az EgyenletMegoldás osztályt, és ezen belül két példányszintű tagosztályt: Elsőfokú és Másodfokú. Itt az Elsőfokú tagosztály adattagjai: egy double megoldás; a Másodfokú tagosztály adattagjai: 2 double megoldás és egy logikai típusú változó, amelyben azt tároljuk, hogy van-e megoldás. Mindkét tagosztályban írjuk meg a konstruktort, és a megoldást kiszámító és visszaadó metódusokat (külön-külön). A Másodfokú osztályban legyen külön diszkriminánst visszaadó metódus. Írjunk használó osztályt a feladathoz. Olvassuk be egy elsőfokú és egy másodfokú egyenlet konstansait és számítsuk ki a megoldásokat. 13/11
3. : Lokális osztály, névtelen osztály. Elmélet: a lokális osztály blokkon belül definiált osztály, hatásköre a blokk végéig terjed. Névtelen osztályról akkor beszélünk, amikor egy osztályt egyidejűleg definiálunk és példányosítunk ugyanabban a kifejezésben. A gyakorlatban vagy interfész implementációjakor vagy örökléssel jön létre. Definiáljunk Autó osztályt, rendszámellenőrzéssel. Az osztály adattagjai: márka (String), évjárat (int), rendszám (String). A rendszám legyen lokális osztály; majd egy másik verzióban névtelen osztály, amit az autó osztály rendszámellenőrző metódusán belül definiálunk. A rendszám 6 karakter hosszú: az első 3 karakter betű, a második 3 karakter szám. Az alábbi megoldás értelmezése: a replaceall() metódussal a rendszám azon karaktereit, amelyek megfelelnek a reguláris kifejezésben megadott mintának, space-re cseréljük és eltároljuk. Ezt összevetjük a megadott rendszámmal. Ha azonos hosszúságúak, akkor helyes a rendszám (nem lett kicserélve egyik karaktere sem). Készítsünk futtatható osztály, amelyben létrehozunk egy autó objektumot. Létrehozáskor ellenőrizzük a rendszámát. Ha helyes eltároljuk, ha nem akkor üres lesz a rendszám. 13/12
VÉGE VÉGE 13/13