730 likes | 896 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. Parancssor-paraméter 9. Feladat – Szavazatkiértékelés VI. Konténerek
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(); } }
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!
Parancssor-paraméter 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
Saját típusú objektumok rendezése, keresése Feladat – Hordókeresés Egy borász különböző méretű henger alakú hordókba tölti borait. Egy hordóra jellemző annak átmérője és magassága (cm-ben), ezek együttesen meghatározzák a hordó kapacitását (literben). A borász a hordók feltöltése után sorba rendezi a hordókat, hogy így könnyebb legyen majd egy adott méretű, illetve kapacitású hordót megtalálni. Írjunk a borásznak egy olyan programot, amely segíti a hordók kiválasztásában! A program elején hozzuk létre a hordókat, majd keressünk a hordósorban adott méretű, illetve kapacitású hordókat!
hasonlítóHordó (átmérő,magasság) kapacitás (60,20) ?? (70,100) 385 equals()? (30,80) 57 (30,70) 49 (100,40) 314 (60,20) 57 • Rendezés: compareTo(), azaz kapacitás szerint • Keresés: equals(), azaz pontos méret szerint
Kontener() kiir() indexOf(kap) indexOf(hasonlitoHordo) :Hordo :Hordo :HordoKereses :Kontener :Hordo Hordo() kapacitas() equals() compareTo() rendez() meretKereses() kapacitasKereses() Hordókeresés – Együttműködési diagram
HordoKereses Kontener Hordo -hordok: Hordo[1000] -size: int -atmero: int -magassag: int HordoKereses() kapacitasKereses() meretKereses() +main() +Hordo() +kapacitas(): int +equals(hordo):boolean +compareTo(hordo):int +toString(): String +Kontener() +kiir() -rendez() +indexOf(hordo): int +indexOf(kap): int +indexOf(kap,index):int * kontener Hordókeresés – Osztálydiagram
import extra.*; class Hordo { private int atmero, magassag; // cm-ben public Hordo(int atmero, int magassag) { this.atmero = atmero; this.magassag = magassag; } public int kapacitas() { // literben return (int)(Math.round(Math.pow(atmero/2.0,2) * Math.PI*magassag/1000)); }
public boolean equals(Hordo hordo) { return (hordo.atmero == atmero) && (hordo.magassag == magassag); } public int compareTo(Hordo hordo) { return kapacitas()-hordo.kapacitas(); } public String toString() { return "\nAtmero:"+Format.right(atmero,6)+ " Magassag:"+Format.right(magassag,6)+ " Kapacitas:"+Format.right(kapacitas(),8); } } // Hordo
class Kontener { private Hordo[] hordok = new Hordo[1000]; private int size=0; public Kontener() { int atmero, magassag; while (size<hordok.length && (atmero=Console.readInt("\nAtmero: "))!= 0) { hordok[size++] = new Hordo(atmero, Console.readInt("Magassag: ")); } rendez(); }
public void kiir() { for (int i=0; i<size; i++) System.out.print(hordok[i]+" "); System.out.println(); }
private void rendez() { for (int i=0; i<=size-2; i++) { int minIndex = i; for (int j=i+1; j<=size-1; j++) if (hordok[j].compareTo(hordok[minIndex])<0) minIndex = j; if (i != minIndex) { Hordo seged = hordok[i]; hordok[i] = hordok[minIndex]; hordok[minIndex] = seged; } } } kapacitások összehasonlítása i. és minIndex. elemcseréje
// Adott méretű hordó keresése: public int indexOf(Hordo hordo) { for (int i=0; i<size; i++) { if (hordok[i].equals(hordo)) return i; } return -1; } // Adott kapacitású hordó keresése elölrõl: public int indexOf(int kap) { return indexOf(kap,0); }
// Adott kapacitású hordó keresése az adott indextől: public int indexOf(int kap, int index) { for (int i=index; i<size; i++) { int iKap = hordok[i].kapacitas(); if (iKap == kap) return i; if (iKap > kap) return -1; } return -1; } } // Kontener
public class HordoKereses { private Kontener kontener; public HordoKereses() { kontener = new Kontener(); kontener.kiir(); meretKereses(); kapacitasKereses(); }
void meretKereses() { // Adott méretű hordók keresése int atmero, magassag; Hordo hasonlitoHordo; atmero = Console.readInt("\nAtmero: "); while (atmero!=0) { hasonlitoHordo = new Hordo(atmero, Console.readInt("Magassag: ")); int index = kontener.indexOf(hasonlitoHordo); if (index >= 0) System.out.println("Indexe: "+index); else System.out.println("Nincs ilyen elem"); atmero = Console.readInt("\nAtmero: "); } }
// Kapacitások keresése: void kapacitasKereses() { int kap; while ((kap=Console.readInt("Ker. kapacitas: "))!=0) { int index = kontener.indexOf(kap); if (index >= 0) System.out.println("Indexe: "+index); else System.out.println("Nincs ilyen hordo"); } } public static void main(String[] args) { new HordoKereses(); } } // HordoKereses
20. Vector és Collections osztályok 1. A konténer funkciói általában 2. Vector osztály 3. Az equals metódus szerepe 4. A konténer elhagyása az UML diagramról 5. Interfészek – Collection, List, Comparable 6. Collections osztály 7. Feladat – Nobel díjasok 8. Feladat – Városok 9. Feladat – Autóeladás VI. Konténerek
Object AnyClass +metódus A konténer funkciói általában add(element) remove(element) size() isEmpty() contains(element) get(i) :AnyClass kliens :Konténer :AnyClass . . . ((AnyClass)element).metódus :AnyClass element
Vector osztály • Vektor = “változtatható méretű tömb” • A vektor mérete az elemek hozzáadásával automatikusan bővül • A vektor elemei indexelhetők • A vektor elemei rendezetlenek, lehetnek egyenlők Keresések, törlések az equals() szerint • Funkciók: • beszúrások (add) • törlések (remove) • keresések (indexOf) • A Vector implementálja a Collection interfészt
initialCapacity capacityIncrement 0 1 2 3 4 size() capacity() :Ember :Ember :Ember :Ember :Ember A Vector bővítése Vector emberek = new Vector(4,3); for (int i=0; i<5; i++) emberek.add(new Ember(...));
Konstruktorok (Vector) • Vector(initialCapacity: int, capacityIncrement: int) • Vector(initialCapacity: int) • Vector() • Vector(c: Collection)
Lekérdezések (Vector) • size(): int • capacity(): int • isEmpty(): boolean • get(index: int): Object • contains(element: Object): boolean • containsAll(c: Collection): boolean • equals(obj: Object): boolean • toString(): String
Módosítások, bővítések (Vector) • setSize(newSize: int) • set(index: int, element: Object): Object • add(element: Object): boolean • add(index: int, element: Object): boolean • addAll(c: Collection): boolean • addAll(index: int, c: Collection): boolean
Törlések (Vector) • remove(element: Object): boolean • remove(index: int) : Object • removeAll(c: Collection): boolean • retainAll(c: Collection): boolean • clear()
Keresések (Vector) • indexOf(obj: Object): int • indexOf(element: Object, index: int): int • lastIndexOf(obj: Object): int • lastIndexOf(obj: Object, index: int): int Feladat – Vector minta Próbáljuk ki egy String objektumokat tároló vektor mű-ködését! Küldjünk a vektornak különböző üzeneteket!
// VectorMinta import extra.*; import java.util.*; public class VectorMinta { static void lista(String info,Vector v) { System.out.println("\n"+info); System.out.println("meret: "+v.size()); for (int i=0; i<v.size(); i++) System.out.println(i+". "+v.get(i)); }
public static void main(String[] args) { Vector v = new Vector(); v.add(new String("Marci")); v.add(new String("Dani")); v.add(new String("Peti")); v.add(new String("Rudi")); lista("4 elemu vektor",v); // Marci Dani Peti Rudi if (v.contains("Peti")) { // true System.out.print("Peti benne van, "); System.out.println("indexe:"+v.indexOf("Peti")); }
v.remove(2); lista("2. torolve",v); // Marci Dani Rudi v.remove("Rudi"); // a két Rudi egyenlő lista("Rudi torolve",v); // Marci Dani v.add(0,new String("Cili")); v.add(1,new String("Marci")); lista("Beszuras elore",v); // Cili Marci Marci Dani int n=v.size(); System.out.println("\nUtolso ket objektum kiirasa"); System.out.println(v.get(n-2)+" "+v.get(n-1)); // Marci Dani
v.set(1,new String("Toni")); // Az eddigi 1. obj. elvész lista("1. elem atirasa Toni-ra",v); // Cili Toni Marci Dani Vector vv = new Vector(v); lista("vv vektor:",vv); // Cili Toni Marci Dani vv.clear(); lista("A vv vektor ures lett",vv); // (üres) vv.add(new String("Marci")); vv.add(new String("Lili")); vv.addAll(v); lista("Marci, Lili és a teljes v hozzáadása vv-hez",vv); // Marci Lili Cili Toni Marci Dani
lista("v vektor:",v); // Cili Toni Marci Dani if (vv.containsAll(v)) // true System.out.println("\nvv tartalmazza v elemeit"); else System.out.println("\nvv nem taralmazza v elemeit"); vv.retainAll(v); lista("vv es v közös része:",vv); //Marci Cili Toni Marci Dani }
Az equals metódus szerepe • Feladat – Törpeprogram • Emberek neveit és magasságait szeretnénk • nyilvántartani. A nyilvántartásban két egyforma nevű • ember nem szerepelhet! • Kérjük be konzolról a hét törpe nevét és magasságát(végjel: névnél Enter). • Listázzuk ki a törpéket a bevitel sorrendjében! • Keressünk meg egy adott nevű törpét, és írjuk ki a magasságát!