programozás i. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfszegedi tudományegyetem...

31
1 Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor Programozás I. 8. gyakorlat

Upload: others

Post on 24-Dec-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

1Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor

Programozás I.

8. gyakorlat

Page 2: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 3: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

}

Page 4: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 5: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 6: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 7: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 8: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 9: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 10: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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!

Page 11: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 12: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 13: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 14: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 15: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-tő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

Page 16: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 16Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor

Page 17: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 18: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 19: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 20: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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!

Page 21: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 22: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 23: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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!)

Page 24: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

}

Page 25: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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)

Page 26: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 27: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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)

Page 28: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 29: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 30: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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

Page 31: Programozás I. - u-szeged.huhferenc/files/prog1/2015/gyak09.pdfSzegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19 Generikus kollekciók • Java 1.5-től

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