Kollekciók IO stream-ek Generikus kollekciók
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
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 List (lista)Set (halmaz) 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
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 KeyValue ”kutya””Bloki” ”gyumolcs””barack” ”eb””Bloki”
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
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();
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
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…
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)
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
létrehozás az ArrayList példáján: Iterator it = 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
Kollekciok.java (honlapom) Kollekciok2.java (honlapom)
a példában HashMap van, de minden Map-re hasonló HashMap map = new HashMap(); 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
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
elemek számának lekérdezése: ◦ map.size(); üres-e: ◦ map.isEmpty();
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(); Iterator it = 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
Mapek.java (honlapom)
Puffer kezelése RandomAccessFile osztály StringTokenizer
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
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!
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
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)
az eddig átvett rész összefoglalása: CollectionAndIO.java (pub)
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 lista = new ArrayList ();
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 it = lista.iterator();
Collection-höz hasonlóan Map is lehet generikus ◦ Map map = new TreeMap (); bejárás iterátorral: ◦ Iterator > it = map.entrySet().iterator();
a kollekciók, mapek egymásba ágyazhatók pl.: ◦ HashMap m = new HashMap (); ◦ HashMap > m = new HashMap >();
CollectionsAndIOGenerics.java (pub) GenerikusKollekciok.java (honlapom)
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());
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. o Írj az osztályhoz paraméteres konstruktort, valamint getter-setter metódusokat! o Definiáld felül az osztályban a toString metódust! Írj egy KutyaMenhely nevű futtatható osztályt. o 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;
o 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 o A létrehozott Kutya objektumok valamilyen kollekcióba kerüljenek bele o 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