Deklarace a vytváření

Podobné dokumenty
Úvod do programování - Java. Cvičení č.4

KTE / ZPE Informační technologie

Abstraktní datové typy: zásobník

OOPR_05. Případové studie

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Java - řazení objektů

OOPR_05. Případové studie

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Konstruktory. Konstruktor je speciální metoda, pro vytváření a inicializaci nových objektů (instancí). Název metody je totožný s názvem třídy.

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programovacích jazyků (Java)

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Algoritmizace a programování

Výčtový typ strana 67

9. přednáška - třídy, objekty

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

8 Třídy, objekty, metody, předávání argumentů metod

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Návrhové vzory Design Patterns

7. Dynamické datové struktury

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Soubor jako posloupnost bytů

7. Datové typy v Javě

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v Javě I. Leden 2008

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Programování v Javě I. Únor 2009

Seminář Java II p.1/43

KTE / ZPE Informační technologie

Kolekce, cyklus foreach

Datové struktury. alg12 1

Více o konstruktorech a destruktorech

Algoritmizace a programování

Třídy a objekty -příklady

Programování v C++ 1, 5. cvičení

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Abstraktní datové typy

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Konstruktory a destruktory

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Abstraktní třída a rozhraní

Java a XML. 10/26/09 1/7 Java a XML

boolean hasnext() Object next() void remove() Kolekce

1. Téma 12 - Textové soubory a výjimky

8. přednáška: Soubory a proudy

3 KTE / ZPE Informační technologie

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Řídicí struktury. alg3 1

Obsah přednášky. dědičnost modifikátory (specifikátory) přístupu

IRAE 07/08 Přednáška č. 1

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Principy objektově orientovaného programování

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Vytváření a použití knihoven tříd

Obsah přednášky. dědičnost modifikátory (specifikátory) přístupu

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

PREPROCESOR POKRAČOVÁNÍ

Generické programování

Mělká a hluboká kopie

Příkaz while. while (podmínka) { příkaz; } Příklad: int i=0; while (i < 10) { System.out.println(i); i++; } // vypíše čísla od 0 do 9

typová konverze typová inference

Teoretické minimum z PJV

17. Projekt Trojúhelníky

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Programování v C++ 2, 4. cvičení

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

1. Programování proti rozhraní

Přehled probírané látky

5 Rekurze a zásobník. Rekurzivní volání metody

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Šablony, kontejnery a iterátory

20. Projekt Domácí mediotéka

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Iterator & for cyklus

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Technologie JavaBeans

Paměť počítače. alg2 1

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Textové soubory. alg9 1

Algoritmizace a programování. Terminálový vstup a výstup

6. Příkazy a řídící struktury v Javě

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Java - výjimky. private void vstup() throws IOException {... }

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programovacích jazyků (Java)

Programování v C++ 2, 8. cvičení

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Java Výjimky Java, zimní semestr

Transkript:

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