programozás i. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfszegedi tudományegyetem...
TRANSCRIPT
1Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
Programozás I.
8. gyakorlat
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 2Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 3Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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();
}
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 4Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 4
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 5Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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)
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 5
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 6Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 6
Bővebben: http://docs.oracle.com/javase/8/docs/api/java/io/package-summary.html
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 7Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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ólBufferedReader be = new BufferedReader(new
FileReader(new File("fajlnev.txt")));
String beolvas = be.readLine();
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 7
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 8Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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”);
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 8
Példaprogram: Fajlkezeles.java
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 9Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 10Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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!
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 11Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 11
Példaprogram: Fajlkezeles.java
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 12Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
Ismétlés - tömbök
• Tömbök előnyei?
• Hátrányai?
• Használatuk?
– Adott tömbelem elérése?
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 12
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 13Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 14Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 15Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 16Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 17Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 18Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 18
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 20Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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!
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 21Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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();
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 22Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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);
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 23Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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!)
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 24Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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();
}
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 25Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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)
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 26Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 27Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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)
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 28Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 29Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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();
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 30Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
Bejárás iterátorral
• Közvetlenül Map-et nem lehet bejárni iterátorral,
ezért át kell alakítanunk halmazzá, amely Entry-
ket 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 adPéldaprogram: Mapek.java
Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 31Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor
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