1.1k likes | 1.29k Views
18. Tömbök 19. Rendezés, keresés, karbantartás 20. Vector és Collections osztályok. VI. Konténerek. 18. Tömbök 1. A tömb általános fogalma 2. Egydimenziós tömb 3. A tömb szekvenciális feldolgozása 4. Gyűjtés 5. Kétdimenziós tömb 6. Többdimenziós tömb 7. A tömb átadása paraméterként
E N D
18. Tömbök 19. Rendezés, keresés, karbantartás 20. Vector és Collections osztályok VI. Konténerek
18. Tömbök 1. A tömb általános fogalma 2. Egydimenziós tömb 3. A tömb szekvenciális feldolgozása 4. Gyűjtés 5. Kétdimenziós tömb 6. Többdimenziós tömb 7. A tömb átadása paraméterként 8. A program paraméterei 9. Feladat – Szavazatkiértékelés VI. Konténerek
Például: hőmérs: number[hó:1..12] hó 1. 2. 3. ... 12. hőmérs 12 15 14 22 hőmérs[3]==14 A tömb általános fogalma • Azonos típusú elemek sorozata • Az elemek száma előre rögzített • Az elemek indexelhetők (sorszámozhatók)
Egydimenziós tömb Javában • Referencia típusú változó • Elemtípus • primitív • referencia • osztály • tömb
Deklarálás <elemtípus>[] <tömbAzonosító>;vagy <elemtípus> <tömbAzonosító>[]; Létrehozás new <elemtípus> [<elemszám>] Indexelés <tömbAzonosító> [index] A tömb hossza <tömbAzonosító>.length
0. 1. 2. 3. 4. 0 10 20 30 40 iArray Példák int[] iArray = new int[5]; for (int i=0; i<iArray.length; i++) iArray[i] = i*10; double[] dArray = new double[20]; for (int i=0; i<dArray.length; i++) dArray[i] = Console.readDouble();
0. 1. 2. 3. sArray :String :String :String Panama Peru Pápua null String[] sArray = new String[4]; sArray[0] = "Panama"; sArray[1] = "Peru"; sArray[2] = "Pápua";
Alapértelmezés szerinti kezdeti érték nullaszerű elemek Inicializáló blokk <elemtípus>[] <tömbazonosító> = {<érték1>, <érték2>, ...} Például: int[] iArray = {0,10,20,30,40}; char[] maganhangzok = {'a','e','i','o','u'}; boolean[] szep = {true,false};
Értékadási kompatibilitás tömbök között t1=t2 megengedett, ha • Primitív elemtípus esetén t1 és t2 elemtípusa azonos; • Referencia elemtípus esetén t2 elemtípusa t1 elemtípusával azonos, vagy annak leszármazottja. Példa int[] iArray1 = {1,3,5,7}, iArray2 = {10,20}; Object[] oArray = null; String[] sArray = {"Get Back","Let It Be"};
0. 1. 2. 3. iArray1 1 3 5 7 0. 1. iArray2 10 20 Szintaktikailag helyes értékadások: iArray1 = iArray2; // iArray1 == {10,20}, iArray2 == {10,20} oArray = sArray; // oArray == {"Get Back","Let It Be"} Szintaktikailag helytelen értékadások: sArray = iArray; // Egyik elemei objektumok,másiké primitívek sArray = oArray; // Az Object-nek nem őse a String!
Feladat – Szövegek Kérjünk be szövegeket a konzolról az üres szöveg végjelig. Ha nem tudunk már több szöveget tárolni, informáljuk erről a felhasználót! Végül írjuk ki a szövegeket először a bekérés sorrendjében, azután pedig visszafelé! import extra.*; public class Szovegek { String[] szovegek = new String[100]; int nSzoveg = 0;
void beker() { String szoveg; while (true) { if (nSzoveg == szovegek.length) { System.out.println("Betelt"); break; } szoveg=Console.readLine(nSzoveg+1+". szöv:"); if (szoveg.equals("")) break; szovegek[nSzoveg] = szoveg; nSzoveg++; } }
void kiirElore() { for (int i=0; i<nSzoveg; i++) System.out.print(szovegek[i]+" "); System.out.println(); } void kiirVissza() { for (int i=nSzoveg-1; i>=0; i--) System.out.print(szovegek[i]+" "); System.out.println(); } public static void main(String[ ] args) { Szovegek szovegek = new Szovegek(); szovegek.beker(); szovegek.kiirElore(); szovegek.kiirVissza(); } }
DobóKocka -n: int = 6{kocka oldalszáma} -tulaj: String -felül: int {aktuális dobás} -dobások: int[n+1] {index 1..n} DobásStatisztika 2 +main(...) +DobóKocka(tulaj:String) +dobás(): int +átlag(): double +toString(): String Feladat – Dobás-statisztika Két ember, Bush és Gates dobókockával versenyez: saját kockájukkal mindketten 10-szer dobnak, és amelyiküknek az átlaga jobb, az nyer. A dobásokat véletlenszám-generátorral szimuláljuk! A verseny végén írjuk ki mindkét versenyző nevét, és azt, hogy hány darab 1-es, 2-es ... 6-os dobásuk volt, valamint dobásaiknak átlagát!
import extra.*; class DoboKocka { private static int n = 6; private String tulaj; private int felul; private int[] dobasok = new int[n+1]; public DoboKocka(String tulaj) { this.tulaj = tulaj; felul = 1; } public int dobas() { felul=(int) (Math.random() * n + 1); dobasok[felul]++; // gyűjtés return felul; // a dobott értéket visszaadja }
public double atlag() { int osszeg=0, dobasSzam=0; for (int i=1; i<=n; i++) { dobasSzam += dobasok[i]; osszeg += dobasok[i]*i; } return osszeg*1.0/dobasSzam; } public String toString() { String str=tulaj; for (int i=1; i<=n; i++) str = str+" "+dobasok[i]; return str+" Atlag: "+atlag(); } }
public class DobasStatisztika { public static void main(String[ ] args) { final int DOBASSZAM = 10; DoboKocka d1 = new DoboKocka("Bush "); DoboKocka d2 = new DoboKocka("Gates"); for (int i=1; i<=DOBASSZAM; i++) { d1.dobas(); d2.dobas(); } System.out.println(d1); System.out.println(d2); } }
Kétdimenziós tömb Deklarálás <elemtípus>[][] <tömbAzonosító>;vagy <elemtípus> <tömbAzonosító>[][]; Létrehozás new <elemtípus> [<méret1>][<méret2>] Indexelés <tömbAzonosító> [index1][index2]
szamok szamok[1][3] 0. 1. 2. 3. 4. szamok[2] szamok[1] szamok[0] 2 1 12 7 53 56 0 0 0 -9 19 -2 2 21 26 Primitív elemtípusú kétdimenziós tömb int[][] szamok = new int[3][5];
versenyzok 1 :Ember 0. 1. 2. :Ember versenyzok[0] :Ember versenyzok[1] :Ember versenyzok[2] versenyzok[3] versenyzok[1][2] Referencia elemtípusú kétdimenziós tömb Ember[][] versenyzok = new Ember[4][3];
2 versenyzok :Ember • 0. • 1. • 2. versenyzok[0] versenyzok[1] • versenyzok[2] versenyzok[0][0] = new Ember(...); versenyzok[3] Referencia elemtípusú kétdimenziós tömb Ember[][] versenyzok = new Ember[4]; versenyzok[0] = new Ember[3];
A tömb átadása paraméterként • Feladat – Paraméter teszt • Írjunk eljárást, amely egy • int elemtípusú tömb elemeit kilistázza! • Object elemtípusú tömb elemeit kilistázza!
public class ParamTeszt { static void kiir(int[] tomb) { for (int i=0; i<tomb.length; i++) System.out.print(tomb[i]+" "); System.out.println(); } static void kiir(Object[] tomb) { for (int i=0; i<tomb.length; i++) System.out.print(tomb[i]+" "); System.out.println(); }
public static void main(String[] args) { int[] szamok1 = new int[2], szamok2 = new int[5]; szamok1[1] = 5; szamok2[0] = 99; szamok2[4] = -5; kiir(szamok1); kiir(szamok2); String[] szerzok1 = {"Mozart","Wagner","Beethoven"}; StringBuffer[] szerzok2 = new StringBuffer[2]; szerzok2[0] = new StringBuffer("Monteverdi"); szerzok2[1] = new StringBuffer("Corelli"); kiir(szerzok1); kiir(szerzok2); } } Az aktuális paraméter tetszőleges hosszú tömb lehet!
A program paraméterei Feladat – Program paraméter teszt Készítsen egy olyan programot, amely a program paramétereit kiírja a konzolra! Próbaként futtassa le a programot a következő három paraméterrel: java ProgParamTeszt Yellow Submarine Yesterday public class ProgParamTeszt { public static void main(String[] args) { for (int i=0; i<args.length; i++) System.out.println(args[i]); } }
19. Rendezés, keresés, karbantartás 1. Rendezés 2. Keresés 3. Karbantartás 4. Primitív elemek rendezése, keresése 5. String objektumok rendezése, keresése 6. Saját osztályú objektumok rendezése, keresése 7. Szövegek rendezett karbantartása VI. Konténerek
Rendezés • Rendezés feltétele: elemek összehasonlíthatók • Összehasonlítás • Primitív elemek: <, >, … hasonlító operátorokkal • Objektumok: metódusokkal (compareTo()) • Rendezési algoritmusok • Minimumkiválasztásos, beszúrásos, buborékos rendezés, gyorsrendezés • Direkt vagy indexes rendezés
Első lépés: Legkisebb elem? Minimumkiválasztásos rendezés ...
Második lépés: Legkisebb elem? ... Minimumkiválasztásos rendezés (folyt.) Eddig rendezett
Harmadik lépés: Legkisebb elem? ... Minimumkiválasztásos rendezés (folyt.) Eddig rendezett
Utolsó lépés: Legkisebb? ... Eddig rendezett Minimumkiválasztásos rendezés (folyt.)
... Minimumkiválasztásos rendezés (folyt.) Egész rendezett
Rendezés előtt (teljes név szerint rendezett): 1 1 2 2 3 3 4 4 5 5 6 6 Abafi Vilmos Finn Aladár Zentai Béla Bor Kázmér Cirok Emil Cirok Emil Murok Jenő Finn Aladár Murok Jenő Bor Kázmér Abafi Vilmos Zentai Béla Rendezés után (keresztnév szerint rendezett): Direkt rendezés
Rendezés előtt: Fő sorozat (teljes név szerint rendezett) 1 2 3 4 5 6 Abafi Vilmos Bor Kázmér Cirok Emil Finn Aladár Murok Jenő Zentai Béla 1 2 3 4 5 6 Indexsorozat (index szerint rendezett) Indexes rendezés
Rendezés után: Fő sorozat (teljes név szerint rendezett) 1 2 3 4 5 6 Abafi Vilmos Bor Kázmér Cirok Emil Finn Aladár Murok Jenő Zentai Béla 4 6 3 5 2 1 Indexsorozat (keresztnév szerint rendezett) Indexes rendezés (folyt.)
Keresés • Keresés feltétele: elemek azonosíthatók • Azonosítás • Primitív elemek: ==, !=, … egyenlőségvizsgáló operátorokkal • Objektumok: metódusokkal (equals()) • Keresési algoritmusok • Szekvenciális keresés • Bináris keresés
2 3 4 5 :Auto :Auto :Auto :Auto BAK900 KOS215 TIT111 ZAB200 Mazda Mazda Mazda Mazda piros fehér fehér fehér auto.equals(hasonlitoAuto)? :Auto Hasonlító objektum Mazda, a rendszám első betűje K K????? Mazda ??? 6 1 :Auto :Auto BOT490 AHA001 Fiat Skoda ezüst fehér Objektum keresése
Karbantartás • Karbantartás feltétele: elemek azonosíthatók • Azonosítás: kulcs (egyedi!) • Karbantartási műveletek • Beszúrás (Felvitel) • Törlés • Módosítás • Hatékonysági szempontok • Gyorsaság • Helyfoglalás
Rendezetlen Rendezett Van kulcs Rendezetlen, van kulcs Rendezett, van kulcs Nincs kulcs Rendezetlen, nincs kulcs Rendezett, nincs kulcs Karbantartás esetei • Rendezetlen konténer • beszúrás, törlés gyors • keresés lassú • Rendezett konténer • rendezett lista, keresés gyors • beszúrás, törlés, módosítás lassú • Van kulcs Az objektumok egyediek • Nincs kulcs Lehet két azonos állapotú objektum
Új elem 1 2 ElemSzám ... ... ElemSzám = ElemSzám + 1 Rendezetlen konténer Felvitel (mindig az utolsó után):
Törlendő elem 1 2 i ElemSzám ... ... ... ElemSzám = ElemSzám - 1 Rendezetlen konténer (folyt.) Törlés:
Rendezetlen konténer (folyt.) Módosítás: Módosított elem 1 2 i ElemSzám ... ... ...
Új elem ElemSzám = ElemSzám + 1 Rendezett konténer Felvitel: 1 ElemSzám ... ...
Törlendő elem 1 ElemSzám ... ... ElemSzám = ElemSzám - 1 Rendezett konténer (folyt.) Törlés:
Rendezett konténer (folyt.) Módosítás: Régi elem törlése + Új elem felvitele
Feladat – Primitív rendezett Kérjünk be a felhasználótól számokat 0 végjelig, majd írjuk ki a számokat értékük szerint növekvő sorrendben! Ezután tegyük lehetővé, hogy a felhasználó kereshessen számokat a bevitt számsorozatban: ha az általa megadott szám benne van a sorozatban, írjuk ki első előfordulásának indexét (nullától számozva), egyébként írjuk ki, hogy "Nincs ilyen szám"! Ha a megadott szám 0, legyen vége a programnak!
Kontener -tomb: int[1000] -size: int PrimitivRendezett kontener +Kontener() +kiir() -rendez() +indexOf(elem:int): int +main(...) Osztálydiagram
import extra.*; class Kontener { private int[] tomb = new int[1000]; private int size=0; public Kontener() { int elem; while ((size<tomb.length) && (elem = Console.readInt("Szam: "))!=0) { tomb[size++] = elem; } rendez(); }
public void kiir() { for (int i=0; i<size; i++) System.out.print(tomb[i]+" "); System.out.println(); } public int indexOf(int elem) { for (int i=0; i<size; i++) { if (tomb[i] == elem) return i; if (tomb[i] > elem) return -1; } return -1; }
private void rendez() { for (int i=0; i<=size-2; i++) { int minIndex = i; for (int j=i+1; j<=size-1; j++) if (tomb[j] < tomb[minIndex]) minIndex = j; if (i != minIndex) { int seged = tomb[i]; tomb[i] = tomb[minIndex]; tomb[minIndex] = seged; } } } } // Kontener