580 likes | 751 Views
4IT101. Pátá přednáška Datové struktury - pokračování Statické prvky třídy. Kolekce. Rozhraní Implementace Algoritmy G enerické typy Všechny třídy jsou z balíčku java.util. Collections. Java Collection Framework. Kolekce. Základní vlastnosti seznamů (List) Libovolný počet prvků
E N D
4IT101 Pátá přednáška Datové struktury - pokračování Statické prvky třídy
Kolekce • Rozhraní • Implementace • Algoritmy • Generické typy • Všechny třídy jsou z balíčku java.util Collections
Kolekce • Základní vlastnosti seznamů (List) • Libovolný počet prvků • Udržuje pořadí • Může obsahovat více prvků stejné hodnoty • Lze používat indexy • Základní vlastnosti množin (Set) • Libovolný počet prvků • Neudržuje pořadí • Nemůže obsahovat více prvků stejné hodnoty • Nelze používat indexy
Základní operace • Vložení prvku – metoda add() • Rušení prvku – metoda remove() • Vyhledání prvku – metoda contains() • Postupné procházení kolekce – cyklus for (tzv. for each)
Balíčky (package) • Java API je tvořeno několika tisíci tříd, které je třeba nějak logicky uspořádat. • Balíček tvoří zároveň i základní jmenný prostor, třída musí mít jednoznačné jméno v rámci package, ve kterém je deklarována. • Klíčové slovo package • Noname package – nepojmenovaný balíček • Základní balíček java.lang • Plná jména tříd x import
Pepa • Vašek Dušan • 5804 Luboš Jarmila • Renata • 5806 Obalové třídy primitivních typů
Obalové třídy • Ke každému primitivnímu typu existuje jeho objektový obal (obalová třída)
K čemu slouží obalové třídy • Obalové třídy jsou read only. • S hodnotami v obalovém typu (stejně jako u všech tříd) se dát pracovat pouze pomocí metod • od 5.0 automatické konverze mezi obalovými třídami a primitivní typy (autoboxing)
Autoboxing Integer cislo = 5; cislo += 2; Integer cislo = new Integer (5); int pomocna = cislo.intValue(); // převod na primitivní typ pomocna += 2; cislo = new Integer(pomocna);
K čemu slouží obalové třídy • Obalové typy obsahují další metody pro práci s těmito typy (např. převod řetězce na číslo) • Obalové třídy číselných typů mají definovány konstanty: • maximální a minimální hodnotu daného typu např. Integer.MAX_VALUE • Jsou zde definovány konstanty jako Double.NEGATIV_INFINITY, Boolean.TRUE, Double.NaN
Pole (array) – základní vlastnosti • Určený počet prvků • Přístup pomocí indexů • Může obsahovat více prvků stejné hodnoty • Lze vkládat primitivní datové typy • Neexistují metody • Obtížně se vyjadřuje neexistence prvku • Rychlejší než seznam (ne vždy) • jednorozměrné i vícerozměrné
Deklarace a inicializace jednorozměrného pole typ [ ] jméno; int [ ] poleCisel; String [ ] nazvyMesicu; jméno = new typ [rozsah]; poleCisel = new int [10]; nazvyMesicu = new String [12]; typ [ ] jméno = new typ [rozsah]; double [ ] poleRealCisel = new double [20]; String [ ] vikend = new {"sobota", "nedele"}
2.4 5.7 8.2 5.0 4.21 0 1 2 3 4 double [] poleRealCisel = {2.4, 5.7, 8.2, 5, 4.21} hodnota index poleRealCisel [0] Na jednotlivé položky pole se odkazujeme jménem pole a indexem položky. Indexuje se od nuly.
Jednorozměrné pole • Každé pole má datový atribut length, která obsahuje údaj o počtu prvků v poli. poleRealCisel.length
Jednorozměrné pole jako parametr metody • Pokud potřebujete metodě předat větší počet parametrů stejného typu, je vhodné deklarovat příslušný parametr jako pole. • Při volání metody můžeme přímo zadat čísla k sečtení do hlavičky metody
Jednorozměrné pole jako parametr metody intvysl = sectiPrvkyPole(newint[] {4, 6, 10, 20});
Jednorozměrné pole jako parametr metody public int sectiPrvkyPole(int [ ] pole) { int soucet = 0; for (int i=0; i < pole.length; i++) { soucet += pole[i]; } return soucet; } public int sectiPrvkyPole(int [ ] pole) { int soucet = 0; for (int prvek : pole) { soucet += prvek; } return soucet; }
Jednorozměrné pole jako parametr metody • Od verze 1.5 je možné použít tzv. proměnlivý počet parametrů metody. public static intsecti(int ... cisla) { intsoucet=0; for (intcislo: cisla) { soucet += cislo; } returnsoucet; } intvysl = secti(4, 6, 10, 20);
Proměnlivý počet parametrů • Lze uvést v hlavičce metody pouze jednou a to na posledním místě • public static String format(String format, Object ... args)
Vícerozměrná pole • Vícerozměrná pole v Javě jsou realizovaná jako pole polí • int poleDvojrozmerne [] []; • int poleDvojrozmerne [] [] = new int [2] [3]; int poleDvojrozmerne [ ] [ ] = new { { 1, 2, 3, }, { 4, 5, 6, }, }
Vícerozměrná pole • int poleDvojrozmerne [ ] [ ] = new int [2] [ ]; • poleDvojrozmerne [0] = new int [3]; • poleDvojrozmerne [1] = new int [5]; • int pocetRadku = poleDvojrozmerne.length; int pocetPrvkuPrvniRadek = poleDvojrozmerne[0].length
Výpis dvourozměrného pole public static voidvypisPole(int [][]pole){ for (int[] radek : pole){ for (int prvek : radek) { System.out.print(prvek + ", "); } System.out.println(); } }
Výpis dvourozměrného pole public static void vypisPole2(int[][]pole){ for (int i = 0; i < pole.length; i++){ for (int j = 0; j < pole[i].length; j++) { System.out.print(pole[i][j] + ", "); } System.out.println(); } }
2.4 5.7 8.2 5.0 4.21 0 1 2 3 4 Mazání v poli Jak smazat položku 8.2 (položku s indexem 2)?
Mazání v poli • Přepsat implicitní hodnotou • Poměrně problematické hlavně u primitivních datových typů • Vytvořit nové pole o délce n – 1 a překopírovat hodnoty
Výčtový typ Enum • od verze 5.0 • Jedná se o specielní typ tříd • Předem daný počet pojmenovaných instancí public enum DenVTydnu { PONDELI, UTERY, STREDA, CTVRTEK, PATEK, SOBOTA, NEDELE }
Použití výčtového typu public void pridejTermin(DenVTydnu den, String odKdy, String doKdy,String popis) { // obsah metody } • typově bezpečné, • odolnější vůči změnám, rozvrh.pridejTermin(DenVTydnu.PONDELI, "14:30", "16:00", "konzultační hodiny"); rozvrh.pridejTermin(DenVTydnu.UTERY, "12:45", "14:15", "konzultační hodiny");
Výčtový typ - operace • for (DenVTydnu den : DenVTydnu.values() ) { • System.out.println(den); • } • metoda values() vrátí seznam hodnot • implementuje Comparable – metoda compareTo • Slouží pro třídění (pořadí deklarace == pořadí při řazení) • metoda valueOf pro získání konkrétní hodnoty z řetězce, • DenVTydnu den = DenVTydnu.valueOf(“SOBOTA”); • DenVTydnu den = DenVTydnu.valueOf(“nedele”);
Rozšíření příkazu switch switch (den) { case NEDELE: case SOBOTA: System.out.println("víkend"); break; case PONDELI: case UTERY: case STREDA: case CTVRTEK: case PATEK: System.out.println("pracovní den"); break; default : System.out.println("takový den neznám"); }
Výčtový typ uvnitř třídy public class Vypocet { private enum Operace { PLUS, MINUS, NASOBENO, DELENO } public double vypocet (Operace operace, double prvni, double druhy) { switch (operace) { case PLUS: return prvni + druhy; case MINUS: return prvni - druhy; case NASOBENO: return prvni * druhy; case DELENO: return prvni/druhy; default : return 0; } }
Výčtový typ – další možnosti public enumHodnoceniKurzu { VYBORNE("1"), VELMI_DOBRE("2"), DOBRE("3"), NEPROSPEL("4"), OMLUVEN("O"); privateStringpismeno; privateHodnoceniKurzu(Stringpismeno) { this.pismeno=pismeno; } } • speciální datové struktury: EnumSet, EnumMap, • výčtový typ lze rozšiřovat o další metody, překrývat stávající metody, • k vlastní hodnotě lze ukládat i doplňující údaje • např. k měsícům lze uložit i počet dní, • k seznamu planet velikost,
Třída (další prvky) Statické proměnné Datové atributy Statický inicializační blok Statické metody Metody Konstruktory Vnitřní třídy Statické vnitřní třídy
Proměnná je společná pro všechny instance dané třídy. V deklaraci je uveden modifikátor static. Ostatní modifikátory se používají stejně jako u datových atributů Pojmenované konstanty jsou obvykle statické (static final) Statické proměnné (proměnné třídy) Zaměstnanec početZaměstnanců jméno příjmeni ...........
Deklarace třídy se statickou proměnnou public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni; ………… }
Vztah instancí k statické proměnné pocetZamestnancu: 2 jmeno: Kája prijmeni: Mařík jmeno: Pepa prijmeni:Novák
Použití statické proměnné • Statická proměnná se používá ve spojení se jménem třídy např. Zamestnanec.pocetZamestnancu • pokud je privátní, nelze ji takto zvenku „přečíst“ ani změnit
Pojmenované konstanty • celá čísla (int) • používají se modifikátorystatic a final public static final int DEN_NEDELE=0; public static final int DEN_PONDELI=1; public static final int DEN_UTERY=2; public static final int DEN_STREDA=3; public static final int DEN_CTVRTEK=4; public static final int DEN_PATEK=5; public static final int DEN_SOBOTA=6;
Použití a nevýhody pojmenovaných konstant public void pridejTermin(int den, String odKdy, String doKdy, String popis) { // obsah metody } rozvrh.pridejTermin(DEN_PONDELI, "14:30", "16:00", "konzultační hodiny"); rozvrh.pridejTermin(DEN_UTERY, "12:45", "14:15", "konzultační hodiny"); rozvrh.pridejTermin(999, "14:30", "16:00", "konzultační hodiny");
Použití modifikátoru final • Modifikátor final je příznakem neměnnosti/konečnosti. • final u třídy – nelze z ní dědit • final u metody – nelze ji překrýt • final u datového atributu a statické proměnné – nelze ji změnit • final u pomocné proměnné – nelze ji změnit • final u parametru metody – nelze ji změnit
Statická metoda (metoda třídy) • Metoda společná pro všechny instance. • Metoda třídy má modifikátor static.
Deklarace statické metody public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni; public Zamestnanec (String jmeno, String prijmeni){ this.jmeno = jmeno; this.prijmeni = prijmeni; pocetZamestnancu ++; } ……………………………………. public static int getPocetZamestnancu(){ return pocetZamestnancu; } }
Volání metody třídy • volání ve stejné třídě, ve které je metoda definována • volání v jiné třídě getPocetZamestnancu(); název metody Zamestnanec.getPocetZamestnancu(); název třídy
Použití statických metod • pro přístup k statickým proměnným • pro operace, kde není zapotřebí instance • pro získání instance na základě parametrů
Inicializace • Všechny objekty musíme vytvořit • S objekty manipulujeme pomocí odkazů • Objekty nemusíme mazat • Zaručená inicializace pomocí konstruktoru
ClassLoader Konstruktor je speciální metoda využívaná při vytváření instance, instanci vytváří JVM. Inicializace objektů v paměti
int pocet = Zamestnanec.getPocetZamestnancu(); Zamestnanec pepa = new Zamestnanec (“Pepa”,”Novák”); Zamestnanec jana = new Zamestnanec (“Jana”,”Nováková”); jmeno = null jmeno = null prijmeni = null prijmeni = null pocetZamestnancu = 0 public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni; public Zamestnanec (String jmeno, String prijmeni){ this.jmeno = jmeno; this.prijmeni = prijmeni; pocetZamestnancu ++; } ……………………………………. public static int getPocetZamestnancu(){ return pocetZamestnancu; } } Pepa Jana Nováková Novák 1 2