OOPR_10 1
Obsah přednášky Deklarace a tvorba polí, jejich použití Rozšířený příkaz cyklu for Třída Registr a datovým atributem typu pole Třídy Zásobník a Fronta Třída Registr pro uložení objektových a polymorfních typů Třída Registr pro uložení objektů typu rozhraní Procházení kolekcí (seznamem) a návrhový vzor Iterátor 2
Deklarace a vytváření Deklarace a vytváření polí Pole jsou objekty, které zabírají místo v operační paměti Vytváří se dynamicky pomocí klíčového slova new int c[] = new int[ 12 ]; je ekvivalentní zápisu: int c[]; // declaruje proměnnou pole c = new int[ 12 ]; // vytváří pole Pole můžeme vytvářet také jedním příkazem: String b[] = new String[ 100 ]; String[] b = new String[100]; 3
Deklarace a vytváření implicitní atribut (funkce) length vrací deklarovanou kapacitu pole double pole[] = new double[4]; for( int i = 0; i < pole.length; i++) pole[i] = i * i; 4
Rozšířený příkaz for J2SE 5.0 rozšířila příkaz for, jenž iteruje přes prvky pole nebo kolekce, bez použití proměnné pro čítač. Syntaxe příkazu: for (typ parametr : jméno_pole) příkaz typ parametru musí souhlasit s typem prvků pole příkaz prochází implicitně všemi prvky pole, což může někdy způsobit problém 5
// Předání argumentů z příkazového řádku. public class InitArray { public static void main( String args[] ) { // kontrola počtu argumentů if ( args.length!= 3 ) System.out.println( "Error: Please re-enter the entire command, including\n" + "an array size, initial value and increment." ); else { // získání prvního argumentu z příkazové řádky int arraylength = Integer.parseInt( args[ 0 ] ); int array[] = new int[ arraylength ]; // create array Předávání argumentů z příkazového řádku java InitArray 5 7 10 // získání dalších argumentů int initialvalue = Integer.parseInt( args[ 1 ] ); int increment = Integer.parseInt( args[ 2 ] ); // výpočet hodnoty pro každý prvek pole for ( int counter = 0; counter < array.length; counter++ ) array[ counter ] = initialvalue + increment * counter; System.out.printf( "%s%8s\n", "Index", "Value" ); // zobrazení indexu a hodnoty pole for ( int counter = 0; counter < array.length; counter++ ) System.out.printf( "%5d%8d\n", counter, array[ counter ] ); // end else // end main // end class InitArray 6
import java.util.scanner; public class Pole { public static void main(string args[]) { int[] a, b; int[] c = new int [6]; String[] s = {"raz","dva","tri"; double[] d = {1.3, -15.36, 23.568, -487.2, 44.0; Přehled možností při práci s polem b= new int[4]; System.out.printf("%s:%9s\n","Index","Hodnota"); for (int i=0; i< s.length; ++i) System.out.printf("%5s:%9s\n",i,s[i]); // zadavani ciselnych hodnot Scanner vstup = new Scanner(System.in); System.out.println("Zadejte hodnoty pole:\n"); for (int i= 0; i< b.length; ++i) { System.out.printf("%4d: ",i+1); b[i] = vstup.nextint(); // tisk pole System.out.printf("%s\n","Hodnota"); for (int i : b) System.out.printf("%7d\n",i); int suma = 0; 7
for (int j: b) suma += j; // suma = suma + j double prumer = suma / b.length; System.out.printf("%20s::%.3f\n","Prumer pole b = ",prumer); prumer = (double) suma / b.length; System.out.printf("%20s::%.3f\n","Prumer pole b = ",prumer); // prirazeni a = b; System.out.printf("%s:%9s\n","Index","Hodnota"); for (int i=0; i< a.length; ++i) System.out.printf("%5s:%9d\n",i,a[i]); if (a == b) System.out.println("ANO"); else System.out.println("NE"); a[3] = -200; System.out.printf("%s:%9s\n","Index","Hodnota"); for (int i=0; i< b.length; i++) System.out.printf("%5s:%9d\n",i,b[i]); System.out.printf("%s:%9s\n","Index","Hodnota"); for (int i= b.length - 1; i >= 0; i--) System.out.printf("%5s:%9d\n",i,b[i]); System.out.printf("%s:%9s\n","Index","Hodnota"); for (int i= b.length - 1; i >= 0; i -= 2) // i=i-2 System.out.printf("%5s:%9d\n",i,b[i]); 8
Index: Hodnota 0: raz 1: dva 2: tri Zadejte hodnoty pole: 1: 12 2: 33 3: 58 4: 62 Hodnota 12 33 58 62 Prumer pole b = ::41,000 Prumer pole b = ::41,250 Index: Hodnota 0: 12 1: 33 2: 58 3: 62 ANO Index: Hodnota 0: 12 1: 33 2: 58 3: -200 Index: Hodnota 3: -200 2: 58 1: 33 0: 12 Index: Hodnota 3: -200 1: 33 Výsledky programu 9
Obecná třída Register - struktura pole je vnitřní datový atribut třídy Registr top ukazatel na místo, kam se má vložit nový prvek do Registru (pole) můžeme vkládat libovolné primitivní a objektové typy třída Registr obsahuje všechny potřebné metody, další nutné metody můžeme doplnit velikost datového atributu pole se určí až za běhu programu prostřednictvím konstruktoru 10
Obecná třída Register - struktura pozor na problém indexů: číslování 0 (n-1) můžeme ponechat, anebo zvolit indexování 1 - n 11
// Trida Registr nejdulezitejsi metody public class Registr { private int pole[]; private int top; // konstruktor public Registr(int pocet) { pole = new int[pocet]; top = -1; Třída Register: - datové atributy - konstruktor - metody: - vložit() - tostring() - tisk() public void vlozit(int prvek) { if ((top + 1) < pole.length) { top += 1; pole[top] = prvek; else System.out.println("Registr je obsazeny"); public String tostring() { String t = String.format("%5s %9s\n","Index","Hodnota"); for (int i=0; i<=top; ++i) t = t+ String.format("%5d %9d\n",i, pole[i]); return t; public void tisk() { System.out.println(this.toString()); 12
Další metody třídy Register getprvek(i) na zadaný (0 top) index vrací prvek registru vyhledat(int prvek) vrátí index na kterém se nachází zadaný prvek, nebo -1 (prvek není v registru) odstranit(int prvek) odstraní z registru zadaný prvek - pokud v registru existuje, jinak se nic neprovede minimum vrátí minimální prvek uložený do registru 13
// trida Registr dalsi metody public class Registr { private int pole[]; private int top; // dalsi metody public int getprvek(int i) { int prvek=0; if (i>=0 && i< = top) prvek = pole[i]; else System.out.printf("%s %d %s\n","index",i,"mimo rozsah ); return prvek; Třída Register - metody: - getprvek() - vyhledat() public int vyhledat(int prvek) { int vysl = -1; for (int i=0; i<= top; i++) { System.out.println("Index: "+i); if (pole[i]== prvek) { vysl = i; break; return vysl; 14
// trida Registr dalsi metody public class Registr { private int pole[]; private int top; // dalsi metody public void odstranit(int prvek) { int v = vyhledat(prvek); if (v > -1 ) {for (int i=v; i< top; i++) pole[i] = pole[i+1]; top -= 1; System.out.println("Prvek odstranen"); else System.out.printf("%s %d %s\n","prvek",prvek,"neni v registru"); Třída Register metody: - odstranit() - minimum() public int minimum() { int min = pole[0]; for(int i=0; i<=top; i++) //for (int cislo: pole) if(pole[i] < min) min = pole[i]; return min; 15
Metoda pro vytvoření nového registru metoda novyreg(kvalif. argument) vytvoří nový objekt register, do kterého se zkopírují všechny celočíselné prvky vyhovující zadané podmínce možnost využít argument metody velikost nového registru je stejná jako u stávajícího registru použijeme vestavěný datový atribut length pro zapisování nových hodnot použijeme metodu vlozit 16
// vytvari novy Registr public class Registr { private int pole[]; private int top; // dalsi metody Třída Register - metoda: - novyreg() // misto pole[i] pouzijeme this.getprvek(i) public Registr novyreg(int cislo) { Registr nreg = new Registr(pole.length); // nreg má délku jako původní register for (int i=0; i<=top; i++) // požadovaná podmínka if(this.getprvek(i)> cislo) nreg.vlozit(this.getprvek(i)); return nreg; 17
public class RegisterTest { public static void main(string args[]) { Registr a = new Registr(5); a.vlozit(10); a.vlozit(15); a.vlozit(-44); a.tisk(); a.odstranit(15); a.tisk(); System.out.println("Minimalni prvek registru: " + a.minimum()); int b= a.getprvek(15); Třída RegisterTest - metoda: - novyreg() Registr b = new Registr(5); b.vlozit(15); b.vlozit(25); b.vlozit(33); Register c = b.novyreg(20); // Registr c; c = b.novyreg(20); c.tisk(); 18
Vytvoření třídy Zásobník s využitím pole Třída Zásobník má datový atribut pole a metody charakteristické pro zásobník 19
public class Zasobnik { private int top; private int a[]; public Zasobnik(int n) { a = new int[n]; top = -1; public void push(int prvek) { if (top+1 < a.length) { top++; a[top]= prvek; else System.out.println("Zasobnik je plny\n"); public int pop() { int prvek = 0; if (top >= 0) { prvek = a[top]; top--; else System.out.println("Zasobnik je prazdny\n"); return prvek; public boolean prazdny() { return (top < 0 ); public boolean plny() { return (top+1 == a.length); 20
public int velikost() { return top+1; public String tostring() { String t =""; t = String.format("%s\n%s%13s\n","Zasobnik vypis", "Index","Hodnota"); int p = top; for(int i = top; i>=0; i--) t += String.format("%5d%13d\n",i,a[i]); return t; public void tisk() { System.out.println(this.toString()); 21
Vytvoření třídy Fronta s využitím pole Třída Fronta má datový atribut pole a metody charakteristické pro frontu nutno vyřešit problém kruhového zápisu 22
public class Fronta { private int a[]; private int pocet, zapisuk, cteniuk; public Fronta(int n) { a = new int[n]; zapisuk = 0; pocet = 0; cteniuk = -1; public void zapis(int prvek) { if (pocet >= a.length) System.out.println("Fronta je plna - zapis neproveden"); else { pocet++; a[zapisuk] = prvek; zapisuk = ((zapisuk+1) % a.length); public int cteni() { int prvek = 0; if (pocet <= 0) System.out.println("Fronta je prazdna"); else { pocet--; cteniuk = (cteniuk + 1) % a.length; prvek = a[cteniuk]; return prvek; 23
public int velikost() { return pocet; public boolean prazdna() { return (pocet == 0); public boolean plna() { return (pocet == a.length); public int kapacita() { return a.length; public String tostring() { int index = cteniuk; String t=""; t = String.format("%s\n%s%13s\n","Fronta vypis", "Index","Hodnota"); for (int i=0; i< pocet; i++) { index = (index +1) % a.length; t += String.format("%5d%13d\n",index,+a[index]); return t; public void tisk() { System.out.println(this.toString()); 24
Modifikace třídy Registr Třída Registr modifikovaná pro ukládání objektů (ne primitivních typů) kvalifikace na objektový typ počáteční inicializace na null při vyhledání testovat, zda vrácený objekt není null odkazovat se na metody objektu uloženého objektu (ne se snažit vše provést přímo) 25
import java.util.calendar; public class Osoba { private String jmeno; private int roknarozeni; private int vaha; public Osoba() { jmeno = "neuvedeno"; roknarozeni = 0; vaha = 0; public Osoba(String jmeno, int roknarozeni, int vaha) { this.jmeno= jmeno; this.roknarozeni = roknarozeni; this.vaha = vaha; public void setjmeno(string jmeno) { this.jmeno = jmeno; public String getjmeno() { return jmeno; public void setroknarozeni(int roknarozeni) { this.roknarozeni = roknarozeni; public int getroknarozeni() { return roknarozeni; 26
public int getvek() { Calendar c = Calendar.getInstance(); int aktrok = c.get(1); return aktrok - this.getroknarozeni(); public void setvaha(int vaha) { this.vaha = vaha; public int getvaha() { return vaha; public String tostring() { return String.format("%5s %s %15s %4d %5s %d\n", "Jmeno",getJmeno(),"rok narozeni:",getroknarozeni(), "vaha:",getvaha()); public void tisk() { System.out.println(this.toString()); 27
// register pro zaznamy - recordy public class RegisterR { private Osoba pole[]; private int top; // konstruktor public RegisterR(int pocet) { top = -1; pole = new Osoba[pocet]; public void vlozit(osoba prvek) { if ((top + 1) < pole.length) { top += 1; pole[top] = prvek; else System.out.println("Registr je obsazeny"); public Osoba getprvek(int i) { Osoba prvek=null; if (i>=0 && i< pole.length) prvek = pole[i]; else System.out.printf("%s %d %s\n","index",i,"mimo rozsah"); return prvek; 28
public int vyhledat(string jmeno) { int vysl = -1; for (int i=0; i<= top; i++) if (pole[i].getjmeno()== jmeno) { vysl = i; break; return vysl; public int vyhledat(osoba prvek) { int vysl = -1; for (int i=0; i<= top; i++) if (pole[i]== prvek) { vysl = i; break; return vysl; //vysl muze byt i null public void odstranit(osoba prvek) { int v = vyhledat(prvek); if (v == -1) System.out.printf("%s %d %s\n","prvek",prvek, "neni v registru"); else this.odstranit(v); public void odstranit(string jmeno) { int v = vyhledat(jmeno); if (v == -1) System.out.printf("%s %s %s","jmeno:", jmeno,"neni v registru"); else this.odstranit(v); 29
public void odstranit(int v) { for (int i=0; i< top - v; i++) pole[v+i] = pole[v+i+1]; top -= 1; System.out.println("Prvek odstranen"); public String tostring() { String t = String.format("%5s %16s\n","Index","Hodnota"); for (int i=0; i<=top; ++i) t = t+ String.format("%5d ",i)+pole[i].tostring(); return t; public void tisk() { System.out.println(this.toString()); // pozor na pouziti zjednoduseneho for // prochazi implicitne celym polem public Osoba minvaha() { Osoba min = pole[0]; for (Osoba zaznam: pole) { if (zaznam!= null) if (zaznam.getvaha() < min.getvaha()) min = zaznam; return min; 30
public Osoba maxvek() { Osoba osobamax = pole[0]; for (int i=0; i<= top; i++) if (pole[i].getvek()> osobamax.getvek()) osobamax = pole[i]; return osobamax; 31
Index Hodnota 0 Jmeno Jana rok narozeni: 1979 vaha: 52 1 Jmeno Jakub rok narozeni: 1985 vaha: 82 2 Jmeno Michal rok narozeni: 1984 vaha: 78 3 Jmeno Dagmar rok narozeni: 1986 vaha: 66 4 Jmeno Silvie rok narozeni: 1977 vaha: 79 Nejstarsi clovek: Jmeno Silvie rok narozeni: 1977 vaha: 79 Nejlehci clovek: Jmeno Jana rok narozeni: 1979 vaha: 52 Prvek odstranen Michal z registru odstranen Index Hodnota 0 Jmeno Jana rok narozeni: 1979 vaha: 52 1 Jmeno Jakub rok narozeni: 1985 vaha: 82 2 Jmeno Dagmar rok narozeni: 1986 vaha: 66 3 Jmeno Silvie rok narozeni: 1977 vaha: 79 32
Třída Register pro ukládání polymorfních objektů Prvky datového atributu pole třídy Register nutno kvalifikovat na hierarchicky nejvyšší objekt (abstraktní třídu, rozhraní) Využívá se pozdní vazba 33
// register pro zaznamy public class RegisterZaznam { private Zaznam pole[]; private int top; public RegisterZaznam(int pocet) { top = -1; pole = new Zaznam[pocet]; public void vlozit(zaznam prvek) { if ((top + 1) < pole.length) { top += 1; pole[top] = prvek; else System.out.println("Registr je obsazeny"); public Zaznam getprvek(int i) { Zaznam prvek=null; if (i>=0 && i< pole.length) prvek = pole[i]; else System.out.printf("%s %d %s\n","index",i,"mimo rozsah"); return prvek; 34
public int vyhledat(int klic) { int vysl = -1; for (int i=0; i<= top; i++) if (pole[i].getklic()== klic) {vysl = i; break; return vysl; public int vyhledat(zaznam prvek) { int vysl = -1; for (int i=0; i<= top; i++) if (pole[i]== prvek) { vysl = i; break; return vysl; public void odstranit(osoba prvek) { int v = vyhledat(prvek); if (v == -1) System.out.printf("%s %d %s\n","prvek", prvek,"neni v registru"); else this.odstranit(v); public void odstranitklic(int klic) // zmena nazvu metody - shoda poctu a typu argumentu { int v = vyhledat(klic); if (v == -1) System.out.printf("%s %5d %s","klic:",klic, "neni v registru"); else this.odstranit(v); 35
public void odstranit(int v) { for (int i=v; i< top; i++) pole[i] = pole[i+1]; top -= 1; System.out.println("Prvek odstranen"); public String tostring() { String t = String.format("%5s %16s\n","Index","Hodnota"); for (int i=0; i<=top; ++i) t = t+ String.format("%5d %s%s",i,pole[i].tostring(),"\n"); return t; public void tisk() { System.out.println(this.toString()); 36
public class RegisterZaznamTest { public static void main(string args[]) { RegisterZaznam rz = new RegisterZaznam(6); Zaznam z = new Zaznam(19); rz.vlozit(z); rz.vlozit(new Kniha(22, Verne, Dva roky prazdnin )); Student s = new Student(44, Jan, muz, informatika ); rz.vlozit(s); rz.tisk(); Zaznam zaz; zaz = rz.vyhledat(22); zaz.tisk(); rz.odstranit(s); 37
Využití třídy Register s hierarchií tříd s rozhraním Hierarchie tříd implementují jedno rozhraní hierarchie hudebních nástrojů objekty ukládané do Registru jsou kvalifikovány jako objekty typu rozhraní - Nastroj 38
Diagram tříd UML 39
package muzika.nastroje; public interface Nastroj { void hrat(); String co(); void sladit(nastroj n); // nemá tělo 40
package muzika.nastroje; public class Smycce implements Nastroj { public void hrat() { System.out.println("Smycce.hrat"); public String co() { return "Smycce"; public void sladit(nastroj ns) { System.out.printf("Nastroj %s ladi s nastrojem %s\n", this.co(), ns.co()); 41
package muzika.nastroje; public class Bici implements Nastroj { public void hrat() { System.out.println("Bici.hrat"); public String co() { return "Bici"; public void sladit(nastroj ns) { System.out.printf("Nastroj %s ladi s nastrojem %s\n", this.co(), ns.co()); 42
package muzika.nastroje; public class Dechy implements Nastroj { public void hrat() { System.out.println("Dechy.hrat"); public String co() { return "Dechy"; public void sladit(nastroj ns) { System.out.printf("Nastroj %s neladi s nastrojem %s\n", this.co(), ns.co()); 43
package muzika.nastroje; public class Dreveny extends Dechy { public void hrat(){ System.out.println("Dreveny.hrat"); public String co(){ return "Dreveny"; 44
package muzika.nastroje; public class Zestovy extends Dechy { public void hrat(){ System.out.println("Zestovy.hrat"); public void sladit(nastroj n){ System.out.printf("Nastroj %s neladi s nastrojem %s\n", n.co(), this.co()); public String co(){ return "Zestovy"; 45
package muzika; import muzika.nastroje.*; // register pro zaznamy public class RegisterR { private Nastroj pole[]; private int top; // konstruktor public RegisterR(int pocet) { top = -1; pole = new Nastroj[pocet]; public void vlozit(nastroj prvek) { if ((top + 1) < pole.length) { top += 1; pole[top] = prvek; else System.out.println("Registr je obsazeny"); public Nastroj getprvek(int i) { Nastroj prvek=null; if (i>=0 && i< pole.length) prvek = pole[i]; else System.out.printf("%s %d %s\n","index",i,"mimo rozsah"); return prvek; 46
public int vyhledat(nastroj prvek) { int vysl = -1; for (int i=0; i<= top; i++) if (pole[i]== prvek) { vysl = i; break; return vysl; public void odstranit(nastroj prvek) { int v = vyhledat(prvek); if (v == -1) System.out.printf("%s %d %s\n","prvek",prvek, "neni v registru"); else this.odstranit(v); public void odstranit(int v) { Nastroj n = pole[v]; for (int i=0; i< top - v; i++) pole[v+i] = pole[v+i+1]; top -= 1; System.out.println("Prvek "+ n.co()+ " odstranen"); 47
public String tostring() { String t = String.format("%5s %16s\n","Index","Hodnota"); for (int i=0; i<=top; ++i) t = t+ String.format("%5d ",i)+pole[i].tostring(); return t; public void tisk() { System.out.println(this.toString()); public void ladit(nastroj i){ i.hrat(); public void laditvse(nastroj nst){ for(int j=0; j<=top; ++j) getprvek(j).sladit(nst); public int gettop(){ return top; 48
Průchod kolekcí - registrem Prvek Registru je kvalifikovaný na typ Nastroj pro průchod Registrem je použit standardní příkaz cyklu for (nevíme, zda je celý objekt řřídy Register obsazený) 49
package muzika; import muzika.nastroje.*; // pracuje s registrem deklarovanym pro Nastroj public class Music { public static void main(string args[]){ RegisterR r= new RegisterR(7); r.vlozit(new Dechy()); r.vlozit(new Bici()); r.vlozit(new Smycce()); r.vlozit(new Zestovy()); // Zestovy z= new Zestovy(); // r.vlozit(z); r.vlozit(new Dreveny()); for(int i=0; i<=r.gettop(); i++) r.getprvek(i).hrat(); r.laditvse(new Smycce()); Nastroj n = r.getprvek(2); n.hrat(); r.odstranit(n); for(int i=0; i<=r.gettop(); i++) r.getprvek(i).hrat(); 50
Dechy.hrat Bici.hrat Smycce.hrat Zestovy.hrat Dreveny.hrat Nastroj Dechy neladi s nastrojem Smycce Nastroj Bici ladi s nastrojem Smycce Nastroj Smycce ladi s nastrojem Smycce Nastroj Smycce neladi s nastrojem Zestovy Nastroj Dreveny neladi s nastrojem Smycce Smycce.hrat Prvek Smycce odstranen Dechy.hrat Bici.hrat Zestovy.hrat Dreveny.hrat 51
Procházením prvky zadané kolekce (seznamu) návrhový vzor Iterátor Častá operace procházení prvky kolekce, jejich zpracování (tisk, filtrace, další úprava) Doposud použití příkazu for, while Protože je to častý požadavek vytvořen návrhový vzor Iterátor Problém zjednodušení procházení seznamy objektů Kontext seznamy objektů a jejich procházení Řešení zavedení rozhraní se základními operacemi hasnext(), next(), remove() 52
Návrhový vzor Iterátor Klient může přistupovat ke struktuře kolekce prostřednictvím metod deklarovaných v rozhraní. Java k implementaci využívá mechanismus vnitřních ních tříd. Ve vnitřní třídě jsou implementovány metody rozhraní. Ve vnější třídě musí být deklarovaná metoda, která vrací objekt vnitřní třídy (Factory metoda). 53
Návrhový vzor Iterátor Uživatel pak pracuje s objektem vnitřní třídy, na který aplikuje metody deklarované v rozhraní. 54
// rozhrani deklarujici metody vnitrni tridy // ktera se pouziva pro prochazeni seznamem public interface MujIterator { // testuje existenci dalsiho prvku v kolekci (seznamu) boolean hasnext(); // vraci aktualni prvek kolekce (seznamu) // kazde pouziti metody next vraci dalsi prvek Nastroj next(); // odstrani aktualni prvek kolekce void remove(); // nahradi aktualni prvek kolekce prvkem (argumentem metody) void setprvek(nastroj prvek); // vraci index (poradi 0 n-1) aktualniho prvku int getindex(); // nastavi index (ukazatel) na zacatek (pozici 0) void reset(); 55
public class RegisterN { private Nastroj pole[]; private int top; public RegisterN(int pocet) { top = -1; pole = new Nastroj[pocet]; // konstruktor // vnitrni trida iterator private class IterReg implements MujIterator { int index = 0; public boolean hasnext(){ return (index <= gettop()); public Nastroj next(){ return pole[index++]; public void remove(){ odstranit(index-1); public void setprvek(nastroj prvek){ pole[index-1]= prvek; public void reset() { index = 0; public int getindex(){ return index; // konec vnitrni tridy IterReg 56
// pristupova metoda k vnitrni tride IterReg public MujIterator getiterreg(){ //standardni nazev iterator() return new IterReg(); public void vlozit(nastroj prvek) { if ((top + 1) < pole.length) { top += 1; pole[top] = prvek; else System.out.println("Registr je obsazeny"); public Nastroj getprvek(int i) { Nastroj prvek=null; if (i>=0 && i< pole.length) prvek = pole[i]; else System.out.printf("%s %d %s\n","index",i,"mimo rozsah"); return prvek; public int vyhledat(nastroj prvek) { int vysl = -1; for (int i=0; i<= top; i++) if (pole[i]== prvek) { vysl = i; break; return vysl; 57
public void odstranit(nastroj prvek) { int v = vyhledat(prvek); if (v == -1) System.out.printf("%s %d %s\n","prvek",prvek, "neni v registru"); else this.odstranit(v); public void odstranit(int v) { Nastroj n = getprvek(v); for (int i=0; i< top - v; i++) pole[v+i] = pole[v+i+1]; top -= 1; System.out.println("Prvek "+ n.co()+ " odstranen"); public String tostring() { String t = String.format("%5s %16s\n","Index","Hodnota"); for (int i=0; i<=top; ++i) t = t+ String.format("%5d ",i)+pole[i].tostring(); return t; 58
public void tisk() { System.out.println(this.toString()); void ladit(nastroj i){ i.hrat(); void laditvse(nastroj nst){ for(int j=0; j<=top; ++j) getprvek(j).sladit(nst); public int gettop(){ return top; 59
package muzika; import muzika.nastroje.*; public class MuzikaN { public static void main(string[] args) { RegisterN rn = new RegisterN(7); rn.vlozit(new Dechy()); rn.vlozit(new Bici()); rn.vlozit(new Smycce()); rn.vlozit(new Zestovy()); rn.vlozit(new Dreveny()); rn.laditvse(new Bici()); MujIterator itr = rn.getiterreg(); while(itr.hasnext()){ itr.next().hrat(); itr.reset(); // nastaveni ukazatele na zacatek String s; int p; while(itr.hasnext()) { s = itr.next().getclass().getname(); p = s.lastindexof('.'); p = p + 1; s = s.substring(p); if(s.equals("zestovy")) { itr.remove(); System.out.println("Zaznam odstranen"); break; 60
itr.reset(); while(itr.hasnext()){ itr.next().hrat(); itr.reset(); while(itr.hasnext()) { s = itr.next().getclass().getname(); p = s.lastindexof('.'); p = p + 1; s = s.substring(p); if(s.equals("bici")) { itr.setprvek(new Dreveny()); System.out.println("Zaznam prepsan"); break; itr.reset(); while(itr.hasnext()){ itr.next().hrat(); 61
itr.reset(); while(itr.hasnext()) { s = itr.next().getclass().getname(); p = s.lastindexof('.'); p = p + 1; s = s.substring(p); if(s.equals("smycce")) { int k = itr.getindex(); System.out.println("Zaznam Smycce na pozici: "+ k); break; 62
Nastroj Dechy neladi s nastrojem Bici Nastroj Bici ladi s nastrojem Bici Nastroj Smycce ladi s nastrojem Bici Nastroj Bici neladi s nastrojem Zestovy Nastroj Dreveny neladi s nastrojem Bici Dechy.hrat Bici.hrat Smycce.hrat Zestovy.hrat Dreveny.hrat Prvek Zestovy odstranen Zaznam odstranen Dechy.hrat Bici.hrat Smycce.hrat Dreveny.hrat Zaznam prepsan Dechy.hrat Dreveny.hrat Smycce.hrat Dreveny.hrat Zaznam Smycce na pozici: 3 63