360 likes | 482 Views
10. gyakorlat. Kollekciók IO stream-ek Generikus kollekciók. Kollekciók (konténerek). objektumokat tartalmaznak nincsen előre meghatározott méretük, bármennyi objektumot pakolhatok beléjük 2 fajta: Collection: egyéni elemek csoportja Map: kulcs-adat kettősök csoportja. Collection.
E N D
10. gyakorlat Kollekciók IO stream-ek Generikus kollekciók
Kollekciók (konténerek) • objektumokat tartalmaznak • nincsen előre meghatározott méretük, bármennyi objektumot pakolhatok beléjük • 2 fajta: • Collection: egyéni elemek csoportja • Map: kulcs-adat kettősök csoportja
Collection • ArrayList: • tömbbel megvalósított lista • elérés gyors • beszúrás lassú • LinkedList: • minden csomóponthoz tartozik mutató előre és hátra, valamint az érték („igazi” láncolt lista) • elérés lassabb • beszúrás gyors • 1 elem sosem szerepel benne kétszer (hiába tesszük bele többször is) • HashSet: • hash táblában tárol • keresés gyors • TreeSet: • fastruktúrában tárol rendezett halmaz List (lista) Set (halmaz)
Map • kulcsokat párosít értékekkel, a kulcsra gyors keresést biztosít • pl.: • kulcs nem ismétlődhet, érték igen • 2 fajtája: • HashMap: bejáráskor véletlenszerű a sorrend • TreeMap: bejáráskor meghatározott a sorrend
Egyszerű elérés, hozzáadás, törlés • az ArrayList példáján, de a többire is hasonlóan működik: ArrayList lista = new ArrayList(); lista.add(new Integer(3)); lista.add(4); A kollekcióba csak objektumot tehetünk! autoboxing: primitív típusból a wrapper osztálya segítségével objektumot készít
Egyszerű elérés, hozzáadás, törlés • hozzáadás a kollekcióhoz: • lista.add(objektum); • lista.add(index, objektum); • ha nem adunk meg indexet, akkor értelemszerűen a következő üres helyre teszi • törlés a kollekcióból: • lista.remove(index); • lista.remove(objektum); • a kollekció méretének lekérdezése: lista.size(); • a kollekció kiürítése: lista.clear();
Egyszerű elérés, hozzáadás, törlés • egy objektum lekérése: • lista.get(index); • a kollekcióban minden Object lesz, így kivételkor „vissza kell adnunk” a típusát típuskényszerítés Kutya kutyus = new Kutya(); lista.add(1, kutyus); Kutya masikKutya = (Kutya) lista.get(1); az Objectet, amit kiveszünk, Kutyára kell kényszeríteni
Típuskényszerítés • a típuskényszerítés „veszélyes művelet”, mivel ClassCastException-t dobhat • mivel tudjuk, mit tettünk bele, így feltehetőleg tudjuk azt is, hogy mire kell majd downcast-olni kivételkor • viszont érdemes csak egy fajta dolgokat beletenni egy kollekcióba (pl. csak Kutya objektumokat, vagy csak Integereket, … stb.), mert különben könnyen összekavarhatjuk a dolgokat downcast-nál • továbbiak: generikus kollekcióknál…
Kollekció tartalmának lekérdezése • tartalmaz-e adott objektumot: • lista.contains(objektum); • igazzal tér vissza, ha van benne ilyen objektum, egyébként hamissal • üres-e: • lista.isEmpty(); • igazzal tér vissza, ha a kollekció üres (ettől még létezik a kollekció, csak éppen nincsen benne semmi)
Bejárás iterátorral • a kollekció ciklussal is bejárható a lista.size() segítségével, de igazán hatékonyan iterátorral tudjuk bejárni • az iterátoros bejárás előnye: • közben nem (illetve csak ellenőrzött módon: remove metódus) módosítható a kollekció • sokkal gyorsabb, mint ciklussal • nem kell ismernünk a bejárt dolog belső szerkezetét
Bejárás iterátorral • létrehozás az ArrayList példáján: Iteratorit = lista.iterator(); • it.hasNext(): megmondja, van-e még következő elem • it.next(): a következő elemet adja vissza (Objectként) ez a kollekció ad egy iterátort, és csak ezt a kollekciót járhatom be vele
Példaprogramok • Kollekciok.java (honlapom) • Kollekciok2.java (honlapom)
Hozzáadás Map-hez • a példában HashMap van, de minden Map-re hasonló HashMap map = newHashMap(); • hozzáadás: • map.put(kulcs, érték); • a kulcs és az érték is objektumok (itt is van autoboxing) • 1 kulcshoz csak 1 érték tartozhat • több egyforma kulcs nem lehet, érték igen
Lekérdezés és egyebek • azt kérdezhetjük le, hogy adott kulcshoz milyen érték tartozik: • map.get(kulcs); • Objectet ad vissza, itt is downcast-olni kell • adott kulcsot tartalmaz-e: • map.containsKey(kulcs); • igazat vagy hamisat ad vissza • adott értéket tartalmaz-e: • map.containsValue(érték); • igazat vagy hamisat ad vissza
Lekérdezés és egyebek • elemek számának lekérdezése: • map.size(); • üres-e: • map.isEmpty();
Bejárás iterátorral • csak halmazt tudok iterátorral bejárni, ezért a Map összes bejegyzését lekérem egy halmazba: • map.entrySet(); • ehhez a halmazhoz hozhatok létre iterátort: • map.entrySet().iterator(); Iteratorit = map.entrySet().iterator(); • it.hasNext(): van-e következő elem? • it.next(): a következő elemet adja vissza, ami Map.Entry típusú erre kell kényszeríteni
Példaprogram • Mapek.java (honlapom)
IO stream-ek Puffer kezelése RandomAccessFile osztály StringTokenizer
Puffer kezelése Writer ki = new FileWriter(new File(”uj.txt”)); ki.write(”a szöveg, amit kiírunk…”); ki.flush; ki.write(”a szöveg további része…”); ki.close(); • flush: ürítjük a puffert, tehát amit eddig a write-nak átadtunk, az biztosan kiíródik • elég lassú művelet
Puffer kezelése • a close() mindenképpen meghívja a pufferürítést is • ha nem fontos azonnal, adott időben kiírni valamit a fájlba, akkor nem feltétlen szükséges a flush()-t használni, mert a lezáráskor úgyis kiíródik minden • a .flush() nem zár le, csak puffert ürít • tehát a close()-ra ilyenkor is szükség van!
RandomAccessFile osztály • akkor hasznos, ha írni és olvasni is akarunk ugyanabból a fájlból kb. egyidőben • metódusai hasonlók az eddig megszokottakhoz: • read() • readLine() • write() • seek() • close() • … • bővebben: Java API
StringTokenizer osztály • segítségével sztringeket darabolhatunk fel részekre • alapértelmezetten 5 esetben darabol: • space • tab • újsor karakter • carriage return • line feed • példaprogram: StringTokenizerPelda.java (honlapom)
Példaprogram • az eddig átvett rész összefoglalása: CollectionAndIO.java (pub)
Generikus kollekciók • Java 1.5-től létezik ilyen • lényege, hogy a kollekcióba csak adott típusú elemet lehessen beletenni • már a Collection-nél is szó volt róla, hogy hasznos ugyanolyan típusú dolgokat tárolni egy kollekcióban, itt ezt kötelezővé is tesszük (meghatározva azt is, mi legyen ez az adott dolog) • olyan lista létrehozása, ami Integereket tárol: • ArrayList<Integer> lista = new ArrayList<Integer>();
Generikus kollekciók • előnye az is, hogy kivételkor nem kell kényszeríteni, mert megőrzi a típust • pl. Integer szam = lista.get(0); Integert ad vissza, nem Objectet • bejárás: generikus iterátorral • Iterator<Integer> it = lista.iterator();
Generikus Map • Collection-höz hasonlóan Map is lehet generikus • Map<Integer, Kutya> map = new TreeMap<Integer, Kutya>(); • bejárás iterátorral: • Iterator<Map.Entry<Integer, Kutya>> it = map.entrySet().iterator();
Egymásba ágyazás • a kollekciók, mapek egymásba ágyazhatók • pl.: • HashMap<String, ArrayList> m = new HashMap<String, ArrayList>(); • HashMap<String, ArrayList<String>> m = new HashMap<String, ArrayList<String>>();
Példaprogram • CollectionsAndIOGenerics.java (pub) • GenerikusKollekciok.java (honlapom)
StringBuffer osztály • függvények segítségével kezelhető a String hossza, tartalma StringBuffer szoveg= new StringBuffer(); szoveg.append(”első rész ”); szoveg.append(”fűzzük hozzá ezt is”).append(” meg ezt is”); System.out.println(szoveg.toString());
Szorgalmi feladat • szerda éjfélig küldhető el 2 pluszpontért nekem e-mailben Feladat: • Írj egy Kutya osztály, mely a következő privát adattagokat tartalmazza: név, fajta, életkor. • Írj az osztályhoz paraméteres konstruktort, valamint getter-setter metódusokat! • Definiáld felül az osztályban a toString metódust! • Írj egy KutyaMenhely nevű futtatható osztályt. • Olvasd be egyetlen String változóba a menhely.txt fájl tartalmát, ami a következő formában tartalmazza a kutyák adatait (tetszőleges számú sort tartalmazhat, hogy pontosan mennyit, arról előre nincsen információnk): Blöki;magyar vizsla;2; Pamacs;puli;1; Rex;német juhász;3;
Szorgalmi feladat • StringTokenizer segítségével darabold fel a beolvasott Stringet a pontosvesszők mentén, és minden újabb hármas alapján hozz létre Kutya objektumokat • A létrehozott Kutya objektumok valamilyen kollekcióba kerüljenek bele • Végül járd be a kollekciót iterátor segítségével, és írasd ki a konzolra a kollekcióban levő objektumokat