Programozás I. 8. gyakorlat 1
StringTokenizer osztály Stringeket darabolhatunk fel vele részekre Alapértelmezetten 5 esetben darabol: Szóköz Tab Újsor karakter Carriage return (kocsi vissza) karakter Line feed http://docs.oracle.com/javase/7/docs/api/java/util/stringtokenizer.html Példaprogram: StringTokenizerPelda.java CollectionAndIO.java 2
StringTokenizer osztály Létrehozás: String s = sor amit tordelni kell ; StringTokenizer st = new StringTokenizer(s); Egyéni karakter mentén történő darabolás: st = new StringTokenizer(s, ; ); Bejárás while ciklussal a legegyszerűbb: while(st.hasmoreelements()) { String resz = st.nextelement().tostring(); } 3
Standard IO Standard input: System.in Standard output: System.out System.out.println( Szöveg ); Standard error: System.err System.err.println( Szöveg ); System.out és a System.err közvetlenül használhatóak 4
Fájlkezelés, IO Adatfolyam alapú megközelítés (amíg van adat olvassuk/amíg van adat írunk, adatfolyam bezárása) InputStream/OutputStream: byte-orientált IO - 8 bites karakter InputStream: adatforrás-folyam OutputStream: adatnyelő-folyam Reader/Writer osztályok: karakter-orientált IO (unicode támogatással) - 16 bites karakter Konvertáló osztályok (pl.: InputStreamReader) 5
Importálás IO-hoz A java.io csomag tartalmazza az íráshoz/olvasáshoz szükséges osztályokat import java.io.*; Amiket használunk belőle: (API) BufferedReader InputStreamReader FileReader FileWriter Bővebben: http://docs.oracle.com/javase/8/docs/api/java/io/package-summary.html 6
Beolvasás fájlból Scannert is használhatunk (múlt óra) BufferedReader FileReader: karakteres fájlokat olvas konstruktorában egy File objektumot vár File f = new File( fajlnev.txt ); readline() - egy sort olvas be a fájlból BufferedReader be = new BufferedReader(new FileReader(new File("fajlnev.txt"))); String beolvas = be.readline(); 7
Kiíratás fájlba FileWriter: karakteres fájlokat ír, egy fájl objektumot/útvonalat (String) vár, ahová ír megadhatjuk, hogy csak hozzáfűzzön a jelenlegi fájlhoz FileWriter ki = new FileWriter(new File( textfajl.txt )); ki.write( szöveg ); Példaprogram: Fajlkezeles.java 8
Puffer kezelése Writer ki = new FileWriter(new File("uj.txt")); ki.write("szöveg, valami blabal"); ki.flush(); ki.write("másvalami szöveg, valami blabal"); ki.close(); flush() metódus: Ürítjük a puffert, azaz, amit eddig átadtunk neki, az biztosan kiíródik a fájlba lassú művelet 9
Puffer kezelése a close() által mindenképpen meghívásra kerül a puffert kiürítő függvény Ha nem szükséges azonnali, adott időbeni kiírás, akkor nem szükséges flush()-t használnunk, hiszen a close() meghívásakor minden kiíródik ennek feltétele viszont, hogy a close()-t használni kell a flush() nem zár le, csak puffert ürít, így a close()-ra mindenképpen szükség van! 10
Megjegyzések Új File objektum létrehozásakor \ helyett \\- t kell használni Windows esetén Kiírásnál sortörés \n helyett operációs rendszer specifikusan: String s = System.lineSeparator(); IO műveletek végén a streameket le kell zárni minden esetben a close() metódus segítségével Példaprogram: Fajlkezeles.java 11
Ismétlés - tömbök Tömbök előnyei? Hátrányai? Használatuk? Adott tömbelem elérése? 12
Kollekciók objektumokat tartalmaznak Előnyei: a tömbbel szemben itt nincs meghatározott méretük, bármennyi objektumot pakolhatunk bele hatékonyabb fejlesztés (gyorsabb is) kész, hatékony kereső, rendező algoritmusok Fajtái: Collection: Set, List, Queue Map: SortedMap 13
List Listák (konkrét megvalósítások) - Egy elem többször is szerepelhet benne ArrayList: tömbbel megvalósított lista elemek elérése gyors (konstans idő) beszúrás lassú LinkedList: láncolt lista (múlt óra) (minden csomóponthoz tartozik egy mutató előre és hátra, valamint az érték) elérése lassabb beszúrás gyorsabb mint az ArrayList-nél 14
Set Egy elem nem szerepel benne többször (hiába tesszük bele többször) HashSet hash táblában tárol keresés gyors TreeSet fastruktúrában tárol mindig(!) rendezett a halmaz 15
16
Map Kulcs-érték párok (kulcsokat párosít értékekkel) A kulcsokra gyors keresés biztosított Kulcs nem ismétlődhet, de érték igen! Fajtái HashMap: bejáráskor véletlenszerű sorrend TreeMap: bejáráskor meghatározott sorrend piros-fekete fa 17
Nem generikus kollekciók Bármilyen típust tárolhatunk bennük Nem szerencsés, csak azonos típusúakat tárolni benne A kollekciók objektumokat tárolnak,nem kell < > közé kiírni Minden esetben Object típusú objektumot kapunk vissza Ezt downcastolni kell, ami veszélyes művelet 18
Generikus kollekciók Java 1.5-től létezik (Jelenleg Java 1.8) Lényege, hogy egy kollekcióban csak adott típusú elemeket tároljunk Korábban csak célszerű volt azonos típusú objektumokat tárolni egy kollekcióban, de így kötelező meghatározzuk, hogy milyen objektumokat tárolunk benne rengeteg hibalehetőségtől kíméljük meg magunkat manapság soha nem használunk NEM generikus kollekciókat Fent emíltett okok miatt 19
Kollekció kezelése Kollekció létrehozása az ArrayList példáján (de a többi is hasonló): List<Integer> lista = new ArrayList<Integer>(); lista.add(new Integer(3)); lista.add(4); // Wrapper objektum képződik! Kollekcióba csak objektumot tehetünk! 20
Kollekció kezelése Hozzáadás 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: lista.remove(objektum); lista.remove(index); Kollekció mérete: lista.size(); Kollekció kiürítése: lista.clear(); 21
Kollekció kezelése Elemek lekérése: lista.get(index); A megfelelő típusú, adott helyen lévő objektumot adja vissza List<Kutya> lista = new ArrayList<Kutya>(); Kutya kutyus = new Kutya(); lista.add(1, kutyus); Kutya elsokutya = lista.get(1); 22
Kollekció kezelése A kollekció tartalmaz-e egy adott objektumot: lista.contains(objektum) - igazzal tér vissza, ha benne van az elem a kollekcióban Üres-e egy adott kollekció: lista.isempty() - igazzal tér vissza, ha üres (létezik a kollekció, de nincs benne elem!) 23
Kollekció kezelése Lista bejárása for ciklussal: hagyományos módon: for(int i = 0; i < lista.size(); i++) { Kutya kutyus = lista.get(i); kutyus.ugat(); } for-each ciklussal: for ( Kutya kutyuli : lista ) { kutyuli.ugat(); } 24
Bejárás iterátorral Igazán hatékony bejárást biztosít Előnyei: sokkal gyorsabb, mint a mezei ciklus használata nem kell ismernünk a bejárt dolgok belső szerkezetét használatával csak ellenőrzött módon módosítható a kollekció (remove() metódus) 25
Bejárás iterátorral Az előző lista példáján hozzunk létre egy iterátort Iterator<Kutya> it = lista.iterator(); it.hasnext() : megmondja, hogy van-e következő elem it.next() : a következő elemet adja vissza Példaprogram: Kollekciok.java, Kollekciok2.java 26
Map-ek kezelése A példában HashMap van, de minden Map-re hasonló A < > között meg kell adni először a kulcs típusát, majd az érték típusát Map<String, Integer> map = new HashMap<>(); Hozzáadás: map.put(kulcs, érték); a kulcshoz és az értékhez is egy-egy objektumot vár (van autoboxing) több azonos kulcs nem lehet! (de érték igen) 27
Map-ek kezelése Egy adott kulcshoz tartozó érték: map.get(kulcs) - egy adott típusú objektummal tér vissza Egy adott kulcsot tartalmaz-e map.containskey(kulcs) - igaz, ha tartalmazza a Map az adott kulcsot Egy adott értéket tartalmaz-e: map.containsvalue(kulcs) - igaz, ha tartalmazza a Map az adott kulcsot 28
Map-ek kezelése Adott map méretének lekérdezése: map.size(); Adott map üres-e map.isempty() - igaz, ha a Map üres (de ettől még létezik, csak nincs benne elem!) Adott map kiürítése: map.clear(); 29
Bejárás iterátorral Közvetlenül Map-et nem lehet bejárni iterátorral, ezért át kell alakítanunk halmazzá, amely Entryket tartalmaz, adott kulcs-érték típusból Set<Entry<String, Integer>> mset = map.entryset(); Ezek után létrehozhatunk ennek a halmaznak egy iterátort: Iterator<Entry<String, Integer>> iter = mset.iterator(); Iterator<Entry<String, Integer>> itermas = map.entryset().iterator(); az iter.next() egy Map.Entry típusú objektumot ad Példaprogram: Mapek.java 30
Egymásba ágyazhatóság A Map-eket, illetve a kollekciókat egymásba is ágyazhatjuk, néhány példa: HashMap<String, ArrayList> m = new HashMap<String, ArrayList>(); HashMap<String, ArrayList<String>> m = new HashMap<String, ArrayList<String>>(); Példaprogram: CollectionsAndIOGenerics.java GenerikusKollekciok.java 31