Algoritmusok Matematika BSc, 2. félév Dr. Szikszai Márton Debreceni Egyetem Természettudományi és Technológiai Kar Matematika Intézet Algebra és Számelmélet Tanszék Debreceni Egyetem 2018/19/II. félév
Kurzus információk Oktató elérhetőségei e-mail: szikszai.marton@science.unideb.hu fogadóóra: péntek 9:00-11:00 (e-mailben egyeztetni) Oktatási segédanyagok oktató honlapja (diasor, mintakódok, stb...) ajánlott irodalom Allen B. Downey, Chris Mayfield, Think Java: How to Think like a Computer Scientist, 2016. Michael T. Goodrich, Roberto Tamassia, and Michael H. Goldwasser, Data Structures and Algorithms in Java, 2014. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, Introduction to Algorithms, 2009. Java, IntelliJ IDEA, Codingground vagy Trinket (órai használat) Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 2 / 100
Kurzus információk Órai munka a gyakorlaton való részvétel kötelező (maximálisan 3 hiányzás) a példaprogramok és példafeladatok otthoni megírása elvárt a csoportos feladatmegoldásba bekapcsolódás ajánlott az előadáson való részvétel nem kötelező, de a gyakorlat megértését nagyban segíti Számonkérés Értékelés félévközi írásbeli tesztek (5 darab, egyenként maximálisan 4 pont) félév végi írásbeli dolgozat (maximálisan 20 pont) összpontszám = tesztek + dolgozat érdemjegy: 0-19 elégtelen (1); 20-24 elégséges (2); 25-29 közepes (3); 30-44 jó (4); 35-40 jeles (5). Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 3 / 100
Témakörök 1 Bevezető 2 Változók és kifejezések 3 Feltételes végrehajtás 4 Ciklikus végrehajtás 5 Metódusok 6 Primitív adatszerkezetek 7 Objektum-orientált programozás 8 Algoritmusok analízise 9 Algoritmusok tervezése 10 Rekurziók 11 Rendezési algoritmusok
1 Bevezető Miért algoritmusok és adatszerkezetek? Objektum-orientált programozás Java progamozási nyelv Első program Kommentelés és dokumentáció Megjegyzések
Miért algoritmusok és adatszerkezetek? Algoritmus - informális definíció Egy probléma- vagy problémaosztály megoldására adott, egyértelműen definiált számítási lépések véges sorozata. Absztrakt adattípus - informális definíció Adatok tárolásának, rendszerezésének és manipulációjának matematikai modellje. Adatszerkezet - informális definíció Egy absztrakt adattípus fizikai megvalósítása. Az algoritmusok és adatszerkezetek elsajátításának előnyei magas szintű absztrakciót igénylő, nem intuitív problémamegoldás platform- és nyelvfüggetlen problémamegoldási minták idő- és memóriahatékony számítások Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 6 / 100
Objektum-orientált programozás Az objektum-orientált programozás (OOP) központi szereplői az objektumok. Minden objektum egy osztály esete. Az osztály sablonként szolgál, definiálja az objektum által tárolt osztályszintű adatokat és metódusokat ezek elérésére és módosítására. Ezen túlmenően minden objektumnak lehetnek példányszintű adatai és metódusai. Az OOP tervezése során megkövetelt célok robosztusság hordozhatóság újrahasznosíthatóság Az OOP megvalósítása során követett elvek absztrakció egységbezárás modularitás Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 7 / 100
Java progamozási nyelv Az algoritmusok és adatstruktúrák az OO paradigmát támogató magas szintű programozási nyelvek alapvető eszközei. A Java nyelv eredendően objektum-orientált osztály-alapú szintaxist használ magas szintű További jellemzői hibrid értelmezésű (fordítással generált bájtkód interpretációja) automatikus memóriakezelés A kurzus során a Java alapszintű elsajátítása szükséges. A tárgyalás bevezető szintű a nyelvi elemeket a kurzushoz elégséges szinten vezeti be lehetőség szerint kapcsolódik a párhuzamosan hallgatott Programnyelvek kurzushoz Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 8 / 100
Java progamozási nyelv A Java program egy azonos elnevezésű osztály, amely minden más kódot tartalmaz. class <fájlnév> { <programkód> A Java osztályai jellemzően nem önálló programok. A futás során végrehajtásra kerülő utasítások egy speciális main metódus törzsében állnak. public static void main(string[] args) { <törzs> A String[] argumentum a felhasználói inputok sorozata (parancssor argumentum). Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 9 / 100
Java progamozási nyelv A public, void szavak módosítók. Módosítókat helyezhetünk változók, metódusok és osztályok elé is. Hozzáférés módosítók public: tetszőleges osztály hozzáférhet protected: az osztály alosztályai és az őt tartalmazó csomag osztályai férhetnek hozzá private: kizárólag az osztályon belül engedélyezett hozzáférés További módosítók static: osztályszintű értékek és metódusok abstract: implementáció nélküli, de hozzáférhető final: változók értékének zárolása, osztály felülírásának és öröklésének blokkolása A kurzus során szinte kivétel nélkül public és static módosítókat használunk. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 10 / 100
Első program A System.out osztály print és println metódusa a standard output stream felületen (kimenetfolyam) jeleníti meg az argumentumot. class PrintDemo { public static void main(string[] args) { System.out.print("My first Java program!"); class PrintDemo { public static void main(string[] args) { System.out.println("My second Java program!"); System.out.println("My second line!"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 11 / 100
Kommentelés és dokumentáció Programok írása során megjegyzéseket fűzhetünk a kódhoz komment formájában. A komment // jelet követően, azzal egy sorban áll. //This is an inline comment. A komment nem kerül végrehajtásra a tárgykód futtatása során. Ha többsoros megjegyzést akarunk írni (blokkoment), akkor / elválasztók közé, minden sort * jellel kezdve van lehetőség. /* *This is a block comment. */ A blokkoment speciálisan /** módon is kezdődhet. Az így írt kommentekből a JavaDoc alkalmazás automatikus dokumentációt képes előállítani. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 12 / 100
Megjegyzések Az OOP során számos további cél és elv megfogalmazható. A Java neve eredetileg Oak volt. A Java számos eleme korábbi nyelvek problémáinak kiküszöbölését célozza, azok ismerete nélkül nem tűnik indokoltnak. A main metódust a java.exe nevű indító olvassa be. Lehetséges egyedi indító implementálása, ahol a main metódus más nevet kap. Java kód írása során a bekezdések, sorközök és egyéb stilisztikai eszközök használata nem kötelező, de ajánlott. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 13 / 100
2 Változók és kifejezések Literálok és konstansok Aritmetikai operátorok Típuskonverzió Változók Kifejezések Csomagoló osztályok Megjegyzések
Literálok és konstansok A literál a nyelv önálló jelentéssel bíró értéke. egész szám: 2 lebegőpontos szám: 3.14, logikai érték: true, false A Java a következő primitív adattípusokat kínálja. üres: null logikai: boolean karakter: char egész szám: byte, short, int, long lebegőpontos szám: float, double Az egész, illetve lebegőpontos számok esetén az int és a double az alapértelmezett. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 15 / 100
Aritmetikai operátorok Alapműveletek összeadás: + kivonás: - szorzás: * osztás: / További aritmetikai operátorok modulus: % Zárójelezés van, a műveleti sorrend standard (PEMDAS). A Java az osztás operátort maradékos osztásként értelmezi egész értékű operandusokon. Az aritmetikai operátorok értelmezettek különböző numerikus típusok között. Az eredmény típusa minden esetben a bővebb osztály. System.out.print(1 + 3-0.5 * 6 / 7 % 4); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 16 / 100
Típuskonverzió A Java statikus és erős típusrendszert használ a típus fordítási időben kerül deklarálásra az utasítások típus-dependensek (általában) Bizonyos esetekben lehetséges típuskonverzió. A típuskonverzió implicit, ha a típusváltozás automatikus. int x = 2; double y = x; System.out.print(y); A típuskonverzió explicit, ha a típusváltást újradeklarálással végezzük int x = 2; System.out.print((double) x); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 17 / 100
Változók A változó értékre való hivatkozás. A változó típusát deklarálni kell, érték a hozzárendelés utasítással adható meg. <típus> <változónév> = <érték> A deklarált típus meg kell egyezzen az érték típusával. int x = 2; Változót lehetséges érték megadása (inicializálás) nélkül is deklarálni. int x; A változónév Unicode karaktereket tartalmaz, betűvel (kis- és nagybetű megkülönböztetett), $, _ jellel kezdődik (utóbbiak kerülendők) nem lehet kulcsszó Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 18 / 100
Változók Java kulcsszavak abstract assert booelan break byte case catch char class const continue default do double else enum extends false final finally float for goto if implements import isinstanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient true try void volatile while Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 19 / 100
Kifejezések A kifejezés literálok, változók és operátorok kompozíciója. int x = 3; int y = 4; System.out.print(x + 2 * y - 1); A literál és a változó önmagában is kifejezés, melyet atomnak mondunk. Atomnak tekinthető minden zárójeles kifejezés is. Kifejezések és utasítások között elvi különbséget teszünk. Előbbiek értékeket reprezentálnak, utóbbiak értékekkel hajtanak végre cselekvéseket. int x = 2; System.out.print(x); Itt a hozzárendelés (=) és a print utasítás, de valójában x is felfogható kifejezés utasításként is. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 20 / 100
Csomagoló osztályok A Java adatszerkezetei és metódusai többnyire objektumokkal manipulálnak, nem értelmezettek a primitív adattípusok esetén. Minden primitív adattípus rendelkezik csomagoló osztállyal, amelynek eseti változójaként objektumként kezelhető. Boolean Character Byte, Short, Integer, Long Float, Double int x = new Integer(0); System.out.print(x); A new utasítás létrehozza az osztály új eseti változóját. Az Integer argumentuma az inicializált érték. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 21 / 100
Megjegyzések A Java kizárólag a felsorolt primitív adattípusokat kínálja. Minden további adattípus vagy adatszerkezet ezekből képzett. A byte, short, int és long típusok rendre 8, 16, 32, illetve 64 biten kerülnek tárolásra. A float és double típusok 32 és 64 biten kerülnek tárolásra. Egész számokat lehet float vagy double típusként deklarálni, de kerülendő (kerekítés). A Java nem támogatja a szimultán hozzárendelést. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 22 / 100
3 Feltételes végrehajtás Logikai értékű operátorok Feltételes végrehajtás Alternatív végrehajtás Láncolt feltételek Egymásba ágyazott feltételek Esetváltás Kivételkezelés Megjegyzések
Logikai értékű operátorok Logikai operátorok és: && vagy: tagadás:! Reláció (összehasonlító) operátorok kisebb: < nagyobb: > egyenlő: == nem egyenlő:!= kisebb vagy egyenlő: <= nagyobb vagy egyenlő: >= A reláció operátorokat teljes biztonsággal csak primitív típusok esetén lehet alkalmazni. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 24 / 100
Feltételes végrehajtás Az if (összetett) utasítás a törzsében lévő kód végrehajtását adott feltétel teljesülésétől teszi függővé. if (<feltétel>) <törzs> A törzs kiértékelésre kerül, ha a fejlécben szereplő feltétel logikai értéke igaz. if (1 < 2) { System.out.print("OK"); A Java feltételes szerkezeteiben a { elválasztók használata opcionális. if (1 < 2) System.out.print("OK"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 25 / 100
Alternatív végrehajtás Az if-else utasítás fejlécében szereplő feltétel hamis logikai értéke esetén a kiértékelés az else ág törzsében történik. if (<feltétel>) <törzs1> else <törzs2> Ha a feltétel értéke igaz, az else ág nem kerül végrehajtásra. if (2 < 1) { System.out.print("OK"); else { System.out.print("KO"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 26 / 100
Láncolt feltételek Az if-else if utasítás során több, egymást nem szükségképpen kizáró, feltételtől tehető függővé a végrehajtás. if (<feltétel1>) <törzs1> else if (<feltétel2>) <törzs2> A kiértékelés sorfolytonos, az első igaz feltétel ágában történik. if (2 < 1) { System.out.print("OK"); else if (1 < 2) { System.out.print("KO"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 27 / 100
Láncolt feltételek Az if-else if utasításban tetszőleges számú feltétel megjelenhet. A láncolt feltételes szerkezet kombinálható az alternatív végrehajtással is, az else ág a legutolsó. if (1 == 3) { System.out.print("branch1"); else if (2 == 3) { System.out.print("branch2"); else { System.out.print("branch3"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 28 / 100
Egymásba ágyazott feltételek A feltételes szerkezetek egymásba is ágyazhatók. if (1 < 2) { System.out.print("if"); if (2 < 3) { System.out.print("ifnested"); Az egymásba ágyazott feltételes szerkezetek kerülendők. if (1 < 2 && 2 < 3) { System.out.print("OK"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 29 / 100
Esetváltás A switch utasítás egy kifejezés értékétől függően hajtja végre egy ágát. switch (<kifejezés>) case <érték1>: <törzs1> break;. int semester = 2; switch (semester) { case 1: System.out.println("First semester"); break; case 2: System.out.println("Second semester"); break; Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 30 / 100
Kivételkezelés A try-catch utasítás lehetővé teszi, hogy a kód végrehajtását megtörő nem szintaktikai hibákat futási időben kiszűrjük. try <törzs1> catch (Exception <kivételnév>) <törzs2> try { String[] inp = {; System.out.print(inp[10]); catch (Exception myexpection) { System.out.print("error"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 31 / 100
Megjegyzések A Java csak a boolean típusnak tulajdonít logikai értéket. A Java nem támogatja a láncolt összehasonlítást. A Java alkalmazza a rövidzárlatos kiértékelést. Egy egymásba ágyazott feltételes szerkezet mindig átírható láncolt feltételes szerkezetté. A Java fordító az esetválasztó szerkezetből 18 eset alatt láncolt feltételes szerkezetet generál bájtkódként. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 32 / 100
4 Ciklikus végrehajtás Határozott lépésszámú ciklus Határozatlan lépésszámú ciklus Poszt-teszt ciklus Ciklusvezérlők Megjegyzések
Határozott lépésszámú ciklus A for utasítás a fejlécében definiált ciklusváltozó értéktartományának minden elemére végrehajtja a törzsében szereplő kódot. for (<inicializáció>;<feltétel>;<növekmény>) <törzs> for (int i = 1; i < 10; i++) { System.out.println(i); A Java alkalmazza a prefix és postfix inkrementálás (++) és dekrementálás (--) operátorokat. int i = 5; System.out.println(++i); System.out.print(i++); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 34 / 100
Határozott lépésszámú ciklus A ciklusban definiált változók lokálisak. for (int i = 1; i < 10; i++) { int x = i; System.out.print(x); Későbbi felhasználás esetén még a ciklus előtt deklarálni kell. int x = 0; for (int i = 1; i < 10; i++) { x = i; System.out.print(x); A ciklusváltozó mindig lokális. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 35 / 100
Határozatlan lépésszámú ciklus A while utasítás végrehajtja a törzsben szereplő kódot mindaddig, amíg a fejlécben szereplő feltétel logikai értéke igaz. while (<feltétel>) <törzs> int i = 5; while (i > 0) { System.out.println(i); i--; Ha a feltétel mindig igaz, akkor a törzs folytonos iterálásra kerül, végtelen ciklust eredményezve. A feltétel teljesülését a ciklus előtt deklarált változóval kontrollálhatjuk. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 36 / 100
Poszt-teszt ciklus Amennyiben legalább egy végrehajtást megkövetelünk, úgy a feltétel tesztelését a fejlécből a törzs után mozgathatjuk. A do-while utasítás ezt a poszttesztelést valósítja meg. do <törzs> while (<feltétel>) int i = 1; do { System.out.println(i); i++; while (i < 5); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 37 / 100
Ciklusvezérlők A ciklusok végrehajtása megállítható a break utasítás használatával. while (true) { System.out.print("That s enough!"); break; Egy adott iteráció végrehajtása megállítható a continue utasítás használatával. for (int i = 1; i < 5; i++) { if (i == 3) { continue; System.out.println(i); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 38 / 100
Megjegyzések A Java speciális határozott lépésszámú ciklust kínál tároló adatszerkezetek bejárására. A for ciklus a ciklusváltozót inkrementáló és dekrementáló while ciklus, jellemzően fordított sorrendben kerülnek bevezetésre. A posztteszt ciklust számos programozási nyelv támogatja. A continue utasítás poszttesztelés esetén a feltétel ellenőrzésére ugrik. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 39 / 100
5 Metódusok Függvény vagy metódus? Importálás Felhasználói input Metódusok definiálása Megjegyzések
Függvény vagy metódus? A függvény utasítások előre definiált sorozata, mely a függvény hívása során végrehajtásra kerül a megadott argumentumok felhasználásával. A metódus olyan függvény, amely egy adott osztály objektumaira hívható. A Java kizárólag metódust értelmez, általános függvényfogalmat nem. A Java számos beépített metódust tartalmaz. numerikus: constructor, toexponential, toprecision,... logikai: tosource, tostring, valueof,... string: replace, search, split,... tömb: pop, push, reserve,... dátum: Date, getday, todatestring,... matematikai: abs, cos, log,... A fenti lista nem kimerítő. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 41 / 100
Importálás További metódusok érhetők el az azokat tartalmazó osztályok importálásával. Azonos típusú osztályok általában egy csomag részei. import <osztálynév> Az import utasítás mindig az osztálydefiníció előtt helyezkedik el. import java.util.scanner; class.... Itt a java egy csomag, a java.util ennek egy alcsomagja, a Scanner pedig a java.util egy osztálya. További hasznos csomagok: java.lang, java.io, java.awt, java.swing, java.net, java.applet, etc... Hasznos osztályok: java.lang.math, java.util.scanner, java.util.arrays. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 42 / 100
Itt az input objektumon alkalmazva a nextint metódust, a következő felhasználói bemenetet int típusként értelmezve (ha lehetséges), az hozzárendelésre kerül a number változóhoz. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 43 / 100 Felhasználói input A System.in osztály használatával elérhető a standard input stream. Ennek olvasását a java.util csomag Scanner osztálya teszi lehetővé. import java.util.scanner; class InputDemo { public static void main(string[] args) { Scanner input = new Scanner(System.in); System.out.print("Write your favorite number"); int number = input.nextint(); System.out.print(number);
Metódusok definiálása Metódus definiálása a main metódus mintájára, egy szinten történik. <módosítók> <érték> <metódusév>(<paraméterek>) { <törzs> Az érték void amennyiben a metódusnak nincs visszatérési értéke. public static void myprint() { System.out.println("myPrint works") Egyéb esetben az érték típusa, melyet a return utasítás előz meg. public static int mynumber() { return 2; Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 44 / 100
Metódusok definiálása A paraméterek a metódus argumentumait hivatkozó lokális változók. A metódus hívását követően a hozzárendelés automatikus. A paraméter típusát deklarálni kell a metódus definiálása során. public static int mynumber(int favorite) { return favorite; Tetszőleges számú paraméter megadható. public static int myadd(int a, int b) { return a + b; Különböző típusú paraméterek megadása lehetséges. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 45 / 100
Megjegyzések A visszatérési értékkel rendelkező metódusokat produktívnak mondjuk. Metódusok definiálása során a törzs mindenképpen { jelek között áll. A Java támogatja a metódus túltöltést (overloading), amennyiben a paraméterek megkülönböztetik az egyébként egyező elnevezésű metódusokat. A Java nem használ kulcsszó argumentumokat, amelyek már a függvény hívása előtt hozzárendelésre kerülnek a paraméterekhez. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 46 / 100
6 Primitív adatszerkezetek Tartalmazó típusok Tömbök Stringek Megjegyzések
Tartalmazó típusok A tartalmazó típus értékek egy kollekciója. Minimális modelljét alábbi tulajdonságai írják le. tárolás: elemek hozzáadása és törlése hozzáférés: elemek elérése bejárás: elemeken való iteráció Általában elvárás, hogy a következő függvények rendelkezésre álljanak. konstruktor: üres tároló létrehozása hozzáadás: egy vagy több elem hozzáadása törlés: egy vagy több elem törlése tartalmazás: tagság ellenőrzése rákövetkezés: iteráció lehetővé tétele hossz: elemek száma Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 48 / 100
Tartalmazó típusok A Java tartalmazó típusok bejárására értelmez egy speciális for ciklust. for (<változó>:<tartalmazó>) törzs Az alkalmazás feltétele, hogy a típus iterálható legyen. int[] container = {1,2,3,4,5; for (int i : container) { System.out.println(i); A ciklusváltozó típusát minden esetben deklarálni kell és egyeznie kell a tároló típusban található elemek típusával. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 49 / 100
Tömbök A tömb azonos típusú értékek egy sorozata. Deklarálása a típust követő [] jelekkel történik. <típus>[] <név>; Értékeket a new utasítással inicializálhatunk. int[] myarray = new int[3]; Itt a tömb elemei mind 0 értéket vesznek fel, csak a hossz kerül egyértelműsítésre. A tömb megadható elemeivel is { jelek között,,-vel elválasztva. int[] myarray = {1,2,3; Egy tömb tetszőleges, nem feltétlen primitív, típus esetén értelmezett. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 50 / 100
Tömbök A tömb megjelenítése nem lehetséges közvetlenül. int[] myarray = {1,2,3; System.out.print(myArray); A java.util.arrays osztály tostring metódusa a kívánt eredményt adja. import java.util.arrays;. int[] myarray = {1,2,3; System.out.print(Arrays.toString(myArray)); Itt a megjelenítés [] határolókkal történik, nem { jelekkel. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 51 / 100
Tömbök A tömb elemeihez indexeik segítségével férhetünk. A Java null-indexelt. int[] myarray = {1,2,3; System.out.print(myArray[1]); A tömb mutábilis, elemeit újradefiniálhatjuk. int[] myarray = {1,2,3; myarray[0] = 0; System.out.print(myArray[0]); A tömb hosszát annak length attribútumával kérhetjük le. int[] myarray = {1,2,3; System.out.print(myArray.length); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 52 / 100
Tömbök Egy tömb bejárható mindkét for és a while ciklus használatával is. int[] data = {1,2,3; for (int i = 0; i < data.length; i++) { System.out.println(data[i]); for (int item : data) { System.out.println(item); int i = 0; while (i < data.length) { System.out.println(data[i]); i++; Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 53 / 100
Stringek A string karakterek "" jelek közé írt elválasztók nélküli sorozata. Deklarálása a String kulcsszóval lehetséges. String <név> = "<karakterek>"; A string elemeit a charat metódussal érthetjük el, indexelése a tömbökével egyező. String word = "bird"; System.out.println(word.charAt(0)); A Java Unicode karakterkészletet használ, így nem-alfabetikus nyelvek szimbólumait is képes megjeleníteni. System.out.print((char) 915); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 54 / 100
Stringek Tetszőleges részstring lekérhető a substring metódus használatával. String word = "bird"; System.out.print(word.substring(1,2)); A string támogatja a konkatenáció műveletet + operátor formájában. System.out.print("first" + "second"); A string immutábilis, nem változtatható meg karakterei újradefiniálásával. Az immutábilis tulajdonság megkerülhető a substring és a + használatával. String word = "bird"; System.out.print(word.substring(0,2) + "th"); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 55 / 100
Stringek Egy string bejárható mindkét for és a while ciklus használatával is. String mystring = "bird"; for (int i = 0; i < word.length(); i++) { System.out.println(word.charAt(i)); A második típusú for közvetlenül nem alkalmazható. A string objektum tochararray metódusával karakterekből álló tömbbé konvertáljuk. String word = "bird"; for (char letter : word.tochararray()) { System.out.println(letter); Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 56 / 100
Megjegyzések A Java számos tároló típust kínál a java.util.collections osztály részeként. A Java közvetlenül nem értelmezi a { jelek közé írt,-vel elválasztott azonos típusú elemeket tömbként. A string nem karakterek egy tömbje. Az egy elemű string nem karakter, karakterek megadása során határolókat használunk. Dr. Szikszai Márton (DE-TTK MI) Algoritmusok 2018/19/II. félév 57 / 100