1 / 36

10. gyakorlat

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.

sun
Download Presentation

10. gyakorlat

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 10. gyakorlat Kollekciók IO stream-ek Generikus kollekciók

  2. 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

  3. 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)

  4. 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

  5. Collection lérehozása, kezelése

  6. 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

  7. 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();

  8. 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

  9. 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…

  10. 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)

  11. 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

  12. 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

  13. Példaprogramok • Kollekciok.java (honlapom) • Kollekciok2.java (honlapom)

  14. Map létrehozása, kezelése

  15. 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

  16. 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

  17. Lekérdezés és egyebek • elemek számának lekérdezése: • map.size(); • üres-e: • map.isEmpty();

  18. 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

  19. Példaprogram • Mapek.java (honlapom)

  20. IO stream-ek Puffer kezelése RandomAccessFile osztály StringTokenizer

  21. 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

  22. 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!

  23. 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

  24. 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)

  25. Példaprogram • az eddig átvett rész összefoglalása: CollectionAndIO.java (pub)

  26. Generikus kollekciók

  27. 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>();

  28. 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();

  29. 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();

  30. 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>>();

  31. Példaprogram • CollectionsAndIOGenerics.java (pub) • GenerikusKollekciok.java (honlapom)

  32. Stringek hatékony összefűzése

  33. 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());

  34. 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;

  35. 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

  36. Köszönöm a figyelmet!

More Related