Programozás III KOLLEKCIÓK.

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
AZ OOP ALAPJAI.
C++ programozási nyelv Gyakorlat hét
Programozás III OOP ALAPOK.
Programozás III KOLLEKCIÓK 2..
Öröklődés 2..
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Objektum-elvű programozás (OOP)
Programozás alapjai.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
Öröklődés Polimorfizmus Csomagok Absztrakt osztályok, interfészek
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
Vizuális modellezés Uml és osztálydiagram UML eszközök
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 5. Gyakorlat Öröklődés, virtuális függvények,
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/10 C++ programozási nyelv Gyakorlat - 5. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 5. rész – Osztályok III.
C# tagfüggvények.
C# tagfüggvények.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Eseménykezelés ismétlés Névtelen metódusok (anonymous methods)
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
OOP ÖRÖKLŐDÉS, INTERFÉSZ
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
A Java jellemzői Hordozható, platformfüggetlen forráskód és bájtkód szinten forráskód és bájtkód szinten Tisztán objektumorientált csak osztályok, illetve.
VI. Konténerek 18. Tömbök 19. Rendezés, keresés, karbantartás
VI. Konténerek 18. Tömbök 19. Rendezés, keresés, karbantartás
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1. Gyakorlat - Alapok 1. Írjon konzolprogramot, amely kiírja a “Hello ELTE” üzenetet! Használja a System.out.println() -t! 2. Írjon konzolprogramot, amely.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
Visual Basic 2008 Express Edition
Java programozási nyelv Filekezelés
Java programozási nyelv Metódusok
Java programozási nyelv Adatbekérés konzolról
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Programozás III KOLLEKCIÓK.
Programozás III KOLLEKCIÓK.
– SELECT - 2. – Tarcsi Ádám március Adatbázis gyakorlat.
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
OOP ÖRÖKLŐDÉS, INTERFÉSZ
Programozás III OOP ALAPOK.
Programozás III OOP ÖRÖKLŐDÉS.
Adatbázis-kezelés 3-4. Adatok lekérdezése utasítás általános formája SELECT [ALL/DISTINCT] {*/, …, } FROM [ ], …, [ ] [WHERE GROUP BY, …, HAVING ORDER.
Feladatok (értékadás)
Objektumorientált alapjai ISZAM III.évf. részére Bunkóczi László.
Programozás III CSOMAG. CSOMAGOK Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek. A Java is csomagok halmaza: csomagokban van.
Ficsor Lajos CPP2 / 1 Származtatási mechanizmus a C++ nyelvben Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Ficsor Lajos Objektumok inicializálása CPP4 / 1 Objektumok inicializálása Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 4. gyakorlat.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Windows Forms alkalmazás készítése Czigléczky Gábor 2009.
Programozás III ÖTLETEK A FELADATMEGOLDÁSHOZ. A HF-EK APROPÓJÁN Néhány javaslat: 1. Jó lenne, ha a feladatmegoldás előtt átnéznék az előadás-anyagokat.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Előadás másolata:

Programozás III KOLLEKCIÓK

JAVA ÖRÖKLŐDÉS – ISMÉTLŐ PÉLDA Példa: A diákokat jellemzi a nevük és születési dátumuk. Minden diák tanul, de a lányok és fiúk nem teljesen azonos módon: a lányok alaposabban, a fiúk nagyvonalúan. Minden lány ugyanannyi órát tanul hetente, és minden fiú is ugyanannyit, de a fiúk, lányok óraszáma különbözik. Hozzunk létre egy diákokat tartalmazó tömböt, és írassuk ki a benne szereplők nevét, tanulási módját. Megjegyzés: ez a példa – bár kissé(?) béna, de alkalmas az öröklődés és a polimorfizmus szemléltetésére is.

JAVA ÖRÖKLŐDÉS – ISMÉTLŐ PÉLDA Indit - Diak[] diakok - void adatBe() - void kiiratas() + void main(String[]) Diak - nev : szöveg - szul_ev : dátum + void tanul() Lany + void tanul() Fiu + void tanul() kérdés: hol kezeljük a heti óraszámot ?

JAVA ÖRÖKLŐDÉS – ISMÉTLŐ PÉLDA

JAVA ÖRÖKLŐDÉS – ISMÉTLŐ PÉLDA

JAVA ÖRÖKLŐDÉS – ISMÉTLŐ PÉLDA 5 3 Kérdés: ki hány órát tanul? Ádám 3 órát tanul hetente. nagyvonalúan tanul Éva 3 órát tanul hetente. alaposan tanul Tanulság: Osztályváltozó/osztálymetódus örökítésével NAGYON csínján kell bánni!

JAVA ÖRÖKLŐDÉS – JAVÍTOTT PÉLDA

JAVA ÖRÖKLŐDÉS – JAVÍTOTT PÉLDA A Lany ugyanilyen, csak a tanul() szövege más.

JAVA ÖRÖKLŐDÉS – TOVÁBBI KÉRDÉS A Fiu osztályban hozzunk létre egy focizik() metódust: Hívjuk meg:

JAVA ÖRÖKLŐDÉS – TOVÁBBI KÉRDÉS Típuskényszerítés kell: Formája: ((Tipus)peldany) - fontos a zárójelezés!  Mi történik, ha a diak példány történetesen Lany?

JAVA ÖRÖKLŐDÉS – TOVÁBBI KÉRDÉS Helyesen: Még helyesebben: Ha csak lehet, kerüljük a típuskényszerítést!

JAVA ÖRÖKLŐDÉS – ISMÉTLÉS Módosítók használata: Adattag: private Lehet-e protected? nem, mert nem biztonságos Lehet-e public? csak akkor, ha final Metódus: private, protected, public vagy módosító nélküli Konstruktorból hívott metódus legyen private. (De csak inicializáló metódust hívjunk!) Mi a polimorfizmus elve?

PROBLÉMAFELVETÉS A diákokra vonatkozó kis mintapéldát bővítsük úgy, hogy a diákok adatait a/ névsor szerint növekvő/csökkenő sorrendben b/ átlag szerint növekvő/csökkenő sorrendben írassuk ki. A feladat tömbökkel vagy listával oldható meg.

KITÉRŐ – TÖMBÖK RENDEZÉSE int a[] = new int[length]; //buborek algoritmus static void buborek(){ int i, j, temp; for (i = 0; i < a.length-1; i++) for(j = i+1; j<a.length; j++) if (a[j] < a[i]){ temp = a[i]; a[i] = a[j]; a[j] = temp; } } 20000 méretű véletlen tömb esetén: Buborék: 1375 ms Arrays.sort: 16 ms // beépített metódus segítségével: java.util.Arrays.sort(a);

KONTÉNEREK A konténer olyan objektum, amely objektumokat tárol, és alkalmas különböző karbantartási, keresési és bejárási funkciók megvalósítására. (A tömb is speciális konténer, de nem osztály, nincs viselkedése, vagyis a tömbben tárolt objektumok karbantartására és az elemek keresésére külön meg kell írni az egyes eljárásokat. Egy konténer osztály az elemek tárolásán kívül a különböző keresési, bejárási, karbantartási funkciókat is megvalósítja.) Egy – sok kapcsolat megvalósítása: konténerek segítségével

EGYÜTTMŰKÖDÉSI DIAGRAM Mindegyik elem tudja, hogy ki az utána következő ( next() ).

OSZTÁLYDIAGRAM

KONTÉNEREK – KOLLEKCIÓK A Java-ban több konténer osztályt implementáltak. java.util csomag, Collection interfész A konténerek általánosak, azokba bármilyen objektumot betehetünk.

Gyűjtemények 

GYŰJTEMÉNY KERETRENDSZER Java Collections Framework (Gyűjtemény keretrendszer) A JCF tartalma: – interfészek: absztrakt reprezentáció, a szolgáltatások megvalósítás-független ábrázolása. – implementációk: az interfészek konkrét implementációi. – algoritusok: a műveleteket megvalósító metódusok. (Ezek többalakú (polimorf) metódusok, vagyis ugyanaz a metódus alkalmazható különböző implementációk esetén.)

GYŰJTEMÉNY KERETRENDSZER

GYŰJTEMÉNY KERETRENDSZER A gyűjtemény interfészei: Set: nem tartalmaz duplikátumot List: tartalmazhat duplikátumot több metódus; bejáráshoz használható az Iterator, ListIterator. Map: kulcs-érték párokat tartalmazó gyűjtemény egy kulcshoz csak egy érték tartozhat

GYŰJTEMÉNY KERETRENDSZER A List interfész és implementációi

GYŰJTEMÉNY KERETRENDSZER A List interfész ismert implementációi: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector Érdemes belenézni a megvalósításukba: NetBeans-ben az osztály nevén Ctrl + kattintás. http://www.ibm.com/developerworks/java/library/j-jtp07233.html

LISTA A lista (List) egy olyan gyűjtemény, amelybe elemeket lehet beszúrni (a végére is és egy adott indexű helyre is), ezeket az elemeket az index alapján el lehet érni, keresni lehet benne, ill. törölni. A listát implementáló osztályok ezeket a funkciókat valósítják meg, illetve bővítik.

boolean add(Típus elem) boolean add(int index, Típus elem) LISTA Néhány metódus: boolean add(Típus elem) boolean add(int index, Típus elem) void clear() boolean contains(Típus elem) Típus get(int index) int indexOf(Típus elem) int lastindexOf(Típus elem) boolean isEmpty() boolean remove(Típus elem) int size()

FELADATMEGOLDÁS Képezzünk név-szám párosokból álló gyűjteményt, és írassuk ki az elemeit! A név-szám párosokat úgy tudjuk együtt kezelni és egy listában tárolni, ha objektumokat készítünk belőlük. Ehhez szükség van a Paros osztály definiálására.

FELADATMEGOLDÁS

FELADATMEGOLDÁS

FELADATMEGOLDÁS

ITERÁLÓ CIKLUS Az iteráló ciklus (foreach típusú) kényelmesebb ciklus-szervezést tesz lehetővé. Pl.: List<Tipus> adatok = new ArrayList<>(); for(Tipus adat: adatok) {…} Tömbökre pl.: int [] tomb = new int [n]; for(int elem: tomb) {…} Megjegyzés: A szakirodalomban ezt a fajta ciklust részesítik előnyben.

A FELADAT FOLYTATÁSA 1. Állapítsuk meg, hogy a gyűjtemény tartalmaz-e egy adott elemet! 2. Oldjuk meg a rendezést.

1. FELADAT MEGOLDÁSA Magyarázat: A különböző objektumreferenciák.

1. FELADAT MEGOLDÁSA Megoldás: Nem ugyanazt kellene keresni, csak ugyanolyat. Erre szolgál az equals és a hashCode metódus. Ezeket mindig a listában lévő elemekre kell alkalmazni, vagyis abban az osztályban definiálni, amilyen típusú elemeket kezelünk.

1. FELADAT MEGOLDÁSA A Paros osztályban: Don’t panic! A NetBeans generálja.  Most két elemet akkor tekintünk azonosnak, ha megegyezik a nevük.

KITÉRŐ Hash tábla, hash kód: A hash tábla kulcs-érték párokat tartalmaz. Amikor egy elemet elhelyezünk a táblában, akkor megadunk egy kulcsot. Ebből a kulcsból bizonyos hash algoritmus használatával az algoritmus előállít egy memóriacímet (indexet), ahová elhelyezi magának az adatnak a mutatóját.

FELADATMEGOLDÁS (kitérő) Hash tábla, hash kód: A kulcs bármilyen típus lehet, ami nem null, és létezik a hashCode() és equals() metódusa. A gyárilag használt típusok (Object, String, Integer, Boolean, stb.) eleve tartalmazzák ezeket a metódusokat. http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29

FELADATMEGOLDÁS (kitérő) Elvárások a hash kódtól: 1. Egy program futása során akárhányszor hívjuk meg ugyanazt az objektumot, mindig ugyanazt az egész értéket adja vissza. (Ez az érték más-más futtatáskor más-más lehet, de egy futtatás során változatlan.) 2. Ha két objektum az equals(Object) metódus alapján egyforma, akkor a hashCode() metódus eredménye mindkét objektum esetén ugyanaz az egész érték legyen. (Ugyanarra a memóriacímre mutasson.)

1. FELADAT MEGOLDÁSA A Paros osztály módosítása után:

„SAJÁT” EQUALS() METÓDUS Természetesen nem muszáj generálni, mi magunk is megírhatjuk az equals() metódust. Pl: (Most akkor tekintjük ugyanolyannak, ha a név is és a szám is egyforma. )

RENDEZÉS A COLLECTIONS OSZTÁLY SEGíTSÉGÉVEL A Comparable interfészt megvalósító osztályok által definiált objektumokból álló kollekciók (gyűjtemények) elemei sorba rendezhetőek, megfordítható a sorrendjük, stb. Erre szolgálnak a Collections osztály metódusai. A Collections osztály nem példányosítható, statikus metódusai vannak. (rendezés, megfordítás, minimum-, maximumkeresés, stb.)

RENDEZÉS A COLLECTIONS OSZTÁLY SEGÍTSÉGÉVEL Az osztály algoritmusai úgy működnek, hogy páronként összehasonlítják a lista elemeit. Ezért ezek a metódusok megkövetelik, hogy a konténerbe betett objektumok összehasonlíthatóak legyenek, vagyis, hogy vagy a/ maguk implementálják a Comparable interfészt, vagy b/ létezzen hozzájuk a Compator interfészt implementáló hasonlító osztály.

RENDEZÉS A COMPARBLE INTERFÉSZ IMPLEMENTÁLÁSÁVAL Comparable interfész Ha objektumokat akarunk összehasonlítani, akkor célszerű az objektumokat definiáló osztályt a Comparable interfész megvalósításként (implementációjaként) definiálni. A java.lang.Comparable interfész egyetlen metódusfejet definiál: public int compareTo(Object obj)

RENDEZÉS A COMPARBLE INTERFÉSZ IMPLEMENTÁLÁSÁVAL A compareTo() formája kötött, a visszaadott érték – negatív, ha az objektum kisebb, mint a paraméterként megkapott obj; – pozitív, ha az objektum nagyobb, mint a paraméterként megkapott obj; – 0, ha a két objektum egyenlő. (A String osztály is implementálja a Comparable interfészt  van benne compareTo() metódus. ) A compareTo() saját magát hasonlítja össze egy kívülről adott objektummal.

RENDEZÉS A COMPARBLE INTERFÉSZ IMPLEMENTÁLÁSÁVAL Tömörebben:

RENDEZÉS A COMPARBLE INTERFÉSZ IMPLEMENTÁLÁSÁVAL A vezérlő osztályban: Hogyan lehetne megoldani, hogy egy választástól függően vagy név, vagy szám szerint, vagy növekvő, vagy csökkenő módon rendezzünk? HF

MÁS ELVŰ RENDEZÉS Másik lehetőség: A Comparator interfészt implementáló hasonlító osztály segítségével rendezünk.

RENDEZÉS A COMPARATOR INTERFÉSZT IMPLEMENTÁLÓ HASONLÍTÓ OSZTÁLY SEGÍTSÉGÉVEL

RENDEZÉS A COMPATOR INTERFÉSZT IMPLEMENTÁLÓ HASONLÍTÓ OSZTÁLY SEGÍTSÉGÉVEL compare(o1,o2) : Negatív, nulla vagy pozitív értéket ad vissza, attól függően, hogy az első argumentuma kisebb, egyenlő vagy nagyobb, mint a második.

FELADATMEGOLDÁS – MI EZ? Válasz: érdeklődőknek google, egyébként következő órán. Mi ez?