Programozási technológia

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

Collections. Összetett adatstruktúrák

Programozási technológia

Reader /Writer InputStreamReader, OutputStreamWriter

Programozási nyelvek Java

Generikus Típusok, Kollekciók

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

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

Java és web programozás

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

Programozási nyelvek Java

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

Fejlett programozási nyelvek C++ Iterátorok

Programozási technológia

Java és web programozás

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

Programozási nyelvek II.: JAVA

Programozási nyelvek Java

Programozási nyelvek Java

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

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?

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.

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

C++ Standard Template Library (STL)

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

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

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

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

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

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

é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

Bevezetés a programozásba 2

Programozási nyelvek Java

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

Algoritmusok és adatszerkezetek II.

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

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

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

Egyirányban láncolt lista

Újdonságok a Java nyelvben

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

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

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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

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

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Már megismert fogalmak áttekintése

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

Programozási technológia

Algoritmusok és adatszerkezetek 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

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

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

Interfészek. PPT 2007/2008 tavasz.

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

Generikusok, Collections Framework JAVA PROGRAMOZÁS 5. GYAKORLAT

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

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

3. Osztályok II. Programozás II

Elemi adatszerkezetek

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

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

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

Önszervező bináris keresőfák

JAVA SE/ME tanfolyam tematika

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

Java programozási nyelv 5. rész Osztályok III.

500. AA Megoldó Alfréd AA 500.

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

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

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

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

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

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Challenge Accepted:C++ Standard Template Library

Java és web programozás

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

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

A C# programozási nyelv alapjai

Osztályok. 4. gyakorlat

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

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

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Programozási nyelvek II.: JAVA

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

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

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

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

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

Algoritmusok és adatszerkezetek 2.

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

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

Struktúra nélküli adatszerkezetek

Átírás:

Programozási technológia Generikus osztályok Gyűjtemények Dr. Szendrei Rudolf ELTE Informatikai Kar 2018.

Generikus osztályok Javaban az UML paraméteres osztályainak a generikus (sablon) osztályok felelnek meg, ahol a paraméterekből generikus paramétereket készítünk. A generikus paraméterek csak osztálynevek lehetnek, amelyekkel a generikus osztály definíciójában paraméterezhető típusok adhatók meg. public class Comparer<T>{ private T item; public T getitem(){} public void setitem(t item){...} public int compare(t otheritem){...} } 2

Generikus osztályok A generikus osztályok használatakor meg kell adni a generikus paraméterek konkrét értékeit (osztályneveket). Ekkor 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"); 3

Generikus osztályok A generikus osztályok használata is egyfajta absztrakció, de az absztrakt osztályokkal ellentétben itt nem az elvégzendő műveletek megvalósítása 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(); 4

Generikus osztályok A két absztrakciót akár együtt is alkalmazhatjuk. public abstract class ItemProcessor<T> { public abstract T getproccesseditem();... } 5

Gyűjtemények 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

Gyűjtemények Példa public class SampleCollection<E> implements Collection<E> { @Override public int size(){...} @Override public boolean isempty(){...} // tárolt elemek "száma" // üres-e? @Override public boolean contains(object o){...} // benne van? @Override public Iterator<E> iterator(){...} @Override public boolean add(e e){...} // bejárás felsorolója // elem hozzávétele @Override public boolean remove(object o){...} // elem eltávolítása @Override public void clear(){...} // gyűjtemény kiürítése } 7

Gyűjtemények Példa public class SampleCollection<E> implements Collection<E> {... @Override // a gyűjtemény minden eleme benne van? public boolean containsall(collection<?> c){...} @Override // hozzáadja a gyűjtemény elemeit public boolean addall(collection<? extends E> c){...} @Override // eltávolítja a gyűjtemény elemeit public boolean removeall(collection<?> c){...} @Override // meghagyja a gyűjtemény elemeit public boolean retainall(collection<?> c){...} @Override public Object[] toarray(){...} // tömbbé konvertálja } @Override public <T> T[] toarray(t[] a){...} // tömbbé konvertálja 8

Gyűjtemények 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ók be 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. 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); 9

Gyűjtemények bejárása 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

Gyűjtemények megvalósítá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 12

A Java gyűjteményei 13

A Java gyűjteményei 14

A Java gyűjteményei 15

A Java gyűjteményei 16

A Java gyűjteményei Gyűjtemények, mint adatszerkezetek 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: kritikus futási idő alapján választunk adatszerkezetet (pl. keresés és beszúrás); adatok feldolgozási módja szerint választunk adatszerkezetet (pl. rendezés); Kis elemszám esetén kényelmesen dolgozhassuk fel az adatokat; speciális feladat esetén készítsünk saját adatszerkezetet (pl. térinformatikai feladatok esetén). 17

A Java gyűjteményei Gyűjtemények, mint adatszerkezetek A Java gyűjteményeit 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). 18

A Java gyűjteményei Közvetlen elérésű, indexelhető gyűjtemények 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, Vector, Stack... 19

A Java gyűjteményei Láncolt listás adatszerkezetű gyűjtemények 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, Deque, PriorityQueue, LinkedList... 20

A Java gyűjteményei Fa adatszerkezetű gyűjtemények 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... 21

A Java gyűjteményei Hasító függvényt alkalmazó gyűjtemények Főbb jellemzők: Gyors elérési, módosítási és törlési lehetőség, kis elemszám / 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: Hashtable HashSet, LinkedHashSet, HashMap, LinkedHashMap... 22

Java gyűjtemények használata Fontos! Azon gyűjtemények esetében, ahol az általunk létrehozott típus tárolása a típus elemek értékeinek összehasonlítása alapján történik, kötelező az equals metódus megvalósítása az osztályunkban! (Pl.: Set, Map stb. tárolók esetében) Amennyiben a választott gyűjtemény hasítófüggvényt alkalmaz, akkor az equals metóduson túl a hashcode metódust is meg kell valósítanunk! (Pl.: HashSet, HashMap stb. esetén) 23

A Java beépített algoritmusai Algoritmusok gyűjteményeken - java.util.collections http://docs.oracle.com/javase/8/docs/api/java/util/collections.html Algoritmusok tömbökön - java.util.arrays http://docs.oracle.com/javase/8/docs/api/java/util/arrays.html 24