Generikus osztályok, gyűjtemények és algoritmusok

Hasonló dokumentumok
Programozási technológia

Collections. Összetett adatstruktúrák

Generikus Típusok, Kollekciók

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Programozási technológia

Reader /Writer InputStreamReader, OutputStreamWriter

Programozási nyelvek Java

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Java és web programozás

Programozási nyelvek Java

Tömbök, kollekciók és egyéb alaposztályok

Programozási technológia

Java és web programozás

Fejlett programozási nyelvek C++ Iterátorok

Adatszerkezetek 1. előadás

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

.Net adatstruktúrák. Készítette: Major Péter

Programozási nyelvek Java

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Programozási nyelvek Java

Magas szintű programozási nyelvek 2 Előadás jegyzet

Programozási nyelvek Java

Láncolt lista Bináris keresőfa Gráf Hasító táblázat. Programozás II. labor 2. rész (Adatszerkezetek)

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Java tutorial. Object. Nehany alaposztaly, amit ismerni illik. tostring. equals vs. ==

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Algoritmusok és adatszerkezetek II.

Programozási nyelvek II.: JAVA

Algoritmusok és adatszerkezetek II.

Egyirányban láncolt lista

Programozás I. Második ZH segédlet

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Bevezetés a programozásba 2

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Java és web programozás

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Tuesday, March 6, 12. Hasító táblázatok

A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

Újdonságok a Java nyelvben

C++ Standard Template Library (STL)

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

OOP: Java 8.Gy: Abstract osztályok, interfészek

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Algoritmusok és adatszerkezetek I. 1. előadás

JAVA PROGRAMOZÁS 2.ELŐADÁS

Algoritmusok és adatszerkezetek II.

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Programozás I. 8. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

3. Osztályok II. Programozás II

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Bevezetés, a C++ osztályok. Pere László

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

Tartalomjegyzék. Köszönetnyilvánítás. 1. Az alapok 1

Programozás alapjai II. (7. ea) C++

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Elemi adatszerkezetek

Láncolt listák. PPT 2007/2008 tavasz.

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Programozás I. Második ZH segédlet

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

Önszervező bináris keresőfák

500. AA Megoldó Alfréd AA 500.

Komputeralgebra Rendszerek

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Programozás. C++ típusok, operátorok. Fodor Attila

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Már megismert fogalmak áttekintése

Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

Osztályok. 4. gyakorlat

Alkalmazott Modul III 6. gyakorlat. Objektumorientált programozás: öröklődés és polimorfizmus

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

Struktúra nélküli adatszerkezetek

Abstract osztályok és interface-ek. 7-dik gyakorlat

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Amortizációs költségelemzés

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

Hasító táblázatok. Hasító függvények, kulcsütközés kezelése. Programozás II. előadás. Szénási Sándor

Interfészek. PPT 2007/2008 tavasz.

JAVA SE/ME tanfolyam tematika

Programozás I. Első ZH segédlet

Gráfok 1. Tárolási módok, bejárások. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Programozási nyelvek II.: JAVA, 11. gyakorlat

Átírás:

Programozási, gyűjtemények és algoritmusok bejárása Informatikai Kar Eötvös Loránd Tudományegyetem 1

Tartalom 1 bejárása 2 bejárása 2

Java-ban és UML-ben bejárása Az UML-beli paraméteres osztályok a Java nyelvben generikus (sablon) osztályok segítségével valósíthatóak meg Az UML-ben megjelölt paraméterek Javaban a generikus paraméterek Java-ban a generikus paraméterek osztálynevek lehetnek, melyek segítségével a generikus osztály definíciójában paraméterezhető típusok adhatóak meg item : T Comparer compare(otheritem : T) : int getitem() : T setitem(item : T) T public class Comparer<T>{ private T item; public T getitem(){...} public void setitem(t item){...} public int compare(t otheritem){...} } 3

Java-ban és UML-ben bejárása A generikus osztályok használatakor meg kell adni a generikus paraméterek konkrét értékeit (a konkrét osztályneveket). Ekkor a generikus osztályban a generikus paraméterekkel jelölt típusok helyére a kapott konkrét típusok helyettesítődnek be. Ettől fogva már példányosíthatjuk a konkrét osztályt. public class Comparer<T>{ private T item; public T getitem(){...} public void setitem(t item){...} public int compare(t otheritem){...} }... Comparer<String> comparer = new Comparer<>(); comparer.setitem("szöveg"); int compared = comparer.compare("valami"); 4

bejárása Java-ban és UML-ben A generikus osztályok használata is egyfajta absztrakció, de az absztrakt osztályokkal ellentétben itt nem az elvégzendő műveletek az ismeretlen, hanem az adatok típusa (legalább részben), amelyeken a műveleteket végezzük. public class Comparer<T>{ private T item;... } public abstract class GeometricShape{ public abstract double getarea(); } A két absztrakciót akár együtt is alkalmazhatjuk public abstract class ItemProcessor<T>{ public abstract T getprocesseditem();... } 5

bejárása A gyűjtemény egy absztrakt adatszerkezet tetszőleges mennyiségű adat csoportosítását végzi az adatok az adott probléma megoldása szempontjából egyformán fontosak az adatokon szabályozott módon lehet műveleteket végezni A tárolt adatok általában egyforma típusúak, vagy legalábbis ugyanabból a típusból vannak származtatva A tömböket nem tekintjük gyűjteményeknek, mert rögzített mérettel rendelkeznek. Igaz, a gyűjtemények megvalósításához gyakran használunk tömböket. 6

public class SampleCollection<E> implements Collection<E> { bejárása @Override // tárolt elemek "száma" (lehetne összméret is...) public int size(){...} @Override // üres-e? public boolean isempty(){...} @Override // tartalmazza az adott objektumot? public boolean contains(object o){...} @Override // a bejárás felsorolója public Iterator<E> iterator(){...} @Override // hozzáadja a megadott elemet public boolean add(e e){...} @Override // eltávolítja a megadott elemet public boolean remove(object o){...} }... 7

- folyt. public class SampleCollection<E> implements Collection<E> {... bejárása @Override // benne van-e a megadott gyűjtemény minden eleme? public boolean containsall(collection<?> c){...} @Override // hozzáadja a megadott gyűjtemény elemeit public boolean addall(collection<? extends E> c){...} @Override // eltávolítja a megadott gyűjtemény elemeit public boolean removeall(collection<?> c){...} @Override // meghagyja a megadott gyűjtemény elemeit public boolean retainall(collection<?> c){...} @Override // eltávolítja az összes elemet public void clear(){...} @Override // tömbbé konvertálja public Object[] toarray(){...} } @Override // tömbbé konvertálja public <T> T[] toarray(t[] a){...} 8

bejárása Egy gyűjtemény bejárásakor a gyűjtemény minden elemét sorra vesszük, és minden elemmel elvégezünk egy adott műveletet Általában a gyűjtemények nem indexelhetőek, ezért egy úgynevezett iterátor segítségével járhatóak be bejárása Collection<Double> doubles = Arrays.asList(2.72, 3.14, 42.0); double sum = 0.0; for (Iterator<Double> it = doubles.iterator(); it.hasnext();) { Double d = it.next(); sum += d; } System.out.println(sum); Megjegyzés: a Double a double adattípus beburkoló" osztálya, amelyre most azért van szükségünk, mert generikus paraméter csak osztály lehet. 9

bejárása Collection<Double> doubles = Arrays.asList(2.72, 3.14, 42.0); bejárása double sum = 0.0; for (Iterator<Double> it = doubles.iterator(); it.hasnext();) { Double d = it.next(); sum += d; } System.out.println(sum); A gyűjtemények egyszerűbben is bejárhatók, ha a foreach ciklust használjuk Collection<Double> doubles = Arrays.asList(2.72, 3.14, 42.0); double sum = 0.0; for (Double d : doubles){ sum += d; } System.out.println(sum); 10

bejárása A Collection<E> interfészt, vagy akár valamelyik speciálisabb interfészét kell megvalósítani Érdemes a megvalósított gyűjteménynek is generikus osztálynak lennie, hogy tetszőleges típusú adat tárolására alkalmas legyen A gyűjtemény műveleteinek absztrakt formái a megvalósítandó interfészben már adottak, így csak a tárolt adatok reprezentációjával és a műveletek függvénytörzseinek meghatározásával kell törődnünk Az AbstractCollection<E> osztály már tartalmazza a szokásos gyűjteményi viselkedést, így érdemes abból származtatni a gyűjteményünket, és csak a lényegre koncentrálni 11

A java gyűjteményei - java.util.collection bejárása 12

A java gyűjteményei - java.util.map bejárása 13

A java gyűjteményei, mint adatszerkezetek bejárása A gyűjteményekben tárolt adatok elérésének, módosításának, törlésének ideje nagyban függ a választott adatszerkezettől (lásd Algoritmusok és adatszerkezetek tárgy) Ökölszabályok kezdőknek: 1 kritikus futási idő alapján választunk adatszerkezetet (pl. keresés és beszúrás); 2 adatok feldolgozási módja szerint választunk adatszerkezetet (pl. rendezés); 3 csekély elemszám esetén kényelmesen dolgozhassuk fel az adatokat; 4 speciális feladat esetén készítsünk saját adatszerkezetet (pl. térinformatikai feladatok esetén). 14

A java gyűjteményei, mint adatszerkezetek bejárása t csoportosíthatjuk a felhasznált adatszerkezet típusa alapján: közvetlen elérésű, indexelhető; láncolt listás; fa adatszerkezetű; hasító függvényt alkalmazó. Bizonyos esetekben a fentiek nem eléggé illeszkednek egy adott feladathoz, ezért elképzelhető, hogy saját hibrid adatszerkezetet készítünk (pl. fa leveleit két irányú láncolt listába fűzzük). 15

A java gyűjteményei Közvetlen elérésű, indexelhető gyűjtemények bejárása Főbb jellemzők: konstans elem elérési idő, lassú beszúrás, könnyű rendezés Gyakran használt Java osztályok: ArrayList, ArrayLinkedList, Vector, Stack... 16

A java gyűjteményei Láncolt listás adatszerkezetű gyűjtemények bejárása Főbb jellemzők: Első/utolsó listaelem azonnal elérhető, a köztes elemek elérési ideje viszont lassú lehet, könnyen bővíthető Gyakran használt Java osztályok: Queue, DeQueue, PriorityQueue, LinkedList... 17

A java gyűjteményei Fa adatszerkezetű gyűjtemények bejárása Főbb jellemzők: Logaritmikus idejű elem elérés, módosítás és törlés, könnyen bővíthető, az elemek indexelése (n-edik elem kiválasztása) megvalósítható, jól alkalmazhatóak asszociatív tárolókhoz Gyakran használt Java osztályok: TreeSet, TreeMap... 18

A java gyűjteményei Hasító függvényt alkalmazó gyűjtemények bejárása Főbb jellemzők: Gyors elérési, módosítási és törlési lehetőség, kis elemszám esetén vagy jó hasító függvény esetén nagyon gyors lehet, az elemek nem indexelhetők az elemek rendezése nem lehetséges jól alkalmazhatóak asszociatív tárolókhoz Gyakran használt Java osztályok: HashSet, LinkedHashSet, HashTable, HashMap, LinkedHashMap... 19

bejárása Algoritmusok gyűjteményeken - java.util.collections http://docs.oracle.com/javase/7/docs/api/java/util/collections.html Algoritmusok tömbökön - java.util.arrays http://docs.oracle.com/javase/7/docs/api/java/util/arrays.html 20