4it101 šestá přednáška

59
4IT101 šestá přednáška

Upload: xandra-riley

Post on 02-Jan-2016

53 views

Category:

Documents


3 download

DESCRIPTION

4IT101 šestá přednáška. Statické prvky třídy. 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. Statické prvky tříd. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 4IT101 šestá přednáška

4IT101šestá přednáška

4IT101šestá přednáška

Page 2: 4IT101 šestá přednáška

Statické prvky třídyStatické prvky třídy

Page 3: 4IT101 šestá přednáška

Statické proměnnéDatové atributyStatický inicializační blokStatické metodyMetodyKonstruktoryVnitřní třídyStatické vnitřní třídy

Třída (další prvky)

Page 4: 4IT101 šestá přednáška

Statické prvky tříd

• Statické datové atributy – data společná všem instancím, existují i bez instancí, jakmile s nimi chceme pracovat

• Statické metody – obdobně jako u statických datových atributů je možné je volat bez existence instance

• V deklaraci je použito klíčové slovo static

Page 5: 4IT101 šestá přednáška

int pocet = Zamestnanec.getPocetZamestnancu();Zamestnanec pepa = new Zamestnanec (“Pepa”,”Novák”);Zamestnanec jana = new Zamestnanec (“Jana”,”Nováková”);

prijmeni = null

jmeno = null

pocetZamestnancu = 0

prijmeni = null

jmeno = nullPepa

Novák

Jana

1

Nováková

2

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; }}

Page 6: 4IT101 šestá přednáška

Návrhový vzor UtilitaKnihovní jednotka

• Je třeba vytvořit skupinu všeobecně přístupných metod případně konstant, není důvod pro existenci instancí.

• Řešení je vytvořit třídu se statickými metodami (případně konstantami) a vytvořit soukromý konstruktor.

Page 7: 4IT101 šestá přednáška

Třída Math

• Třída ze standardu Javy, která obsahuje pouze statické konstanty a statické metody

• Třída nemá veřejný konstruktor, nelze tedy vytvořit instanci

• Takto navržená třída se označuje jako utilita

Page 8: 4IT101 šestá přednáška

Třída Math• Jsou zde dvě konstanty

– Math.PI– Math.E

• Metody pro matematické funkce např.– Math.abs(double a)– Math.cos(double a)– Math.max(long a, long b)– Math.sqrt(double a)

Page 9: 4IT101 šestá přednáška

Třída System

• další utilita ze základního balíčku java.lang

• poskytuje tři statické proměnné sloužící pro vstup a výstup z/na konzolu (lze přesměrovat jinam) – in– out– err

Page 10: 4IT101 šestá přednáška

System.out

• Statická proměnná System.out je automaticky nasměrovaná na konzolu, je typu PrintStream

• Nejčastěji se používá pro volání dvou metod:println (String text)print (String text)

Page 11: 4IT101 šestá přednáška

Třída System

• metody z této třídy slouží pro čtení properties, nastavení zabezpečení atd.

• metoda System.exit(int status)– k ukončení aplikace (pokud je někdy

třeba skončit jinak než provedením všech příkazů)

Page 12: 4IT101 šestá přednáška

Návrhový vzor SingletonJedináček

• V aplikaci je třeba, aby existovala pouze jedna snadno dostupná instance dané třídy. Např. plátno v projektech s kreslením.

• Realizuje se pomocí soukromého konstruktoru a statické metody getInstance().

Page 13: 4IT101 šestá přednáška

private static Platno platnoSingleton;

/**Tovarni metoda pro ziskani instance * tridy Platno - singleton. */ public static Platno getPlatno() { if(platnoSingleton == null) { platnoSingleton = new Platno("Demonstrační

plátno",300, 300,Color.WHITE); } platnoSingleton.setVisible(true); return platnoSingleton;}

private Platno(String titulek, int sirka, int vyska, Color barvaPozadi){

Page 14: 4IT101 šestá přednáška

Metoda main – spouštění javovské aplikace

• Aby bylo možno spustit aplikaci, musí existovat vstupní bod do aplikace

• Při spouštění JVM říkáme, jaká třída má být natažena do paměti prvníjava MojeTrida

• JVM pak hledá v kódu metodu main s následující hlavičkou:public static void main (String [] args)

• Aplikace provede kód v metodě main a skončí– dříve – výjimky, return, metodou

System.exit( ),– později – čekání na dokončení vláken

Page 15: 4IT101 šestá přednáška

Parametry příkazové řádkypublic static void main(String [] args)

• Na příkazovém řádku je možno uvést parametry:java Trida ahoj 15 48 45.4 "Dobry den"

"ahoj" "15" "48" "45.4" "Dobry den"

0 1 2 3 4

Page 16: 4IT101 šestá přednáška

MapyMapy

Datové struktury pro uložení dvojice klíč - hodnota

Page 17: 4IT101 šestá přednáška

pondělí 8 úterý 9středa 7čtvrtek 10pátek 6

5801 Pepa

5802 Vašek Dušan

5804 Luboš Jarmila

5805 Renata

5806

Mapy

Page 18: 4IT101 šestá přednáška

Mapy• Lze si je představit jako tabulku se dvěma

sloupci. První sloupec představuje klíč, žádné dva klíče si nejsou rovny. Druhý sloupec představuje hodnoty, tady se údaje mohou opakovat.

• dvě základní implementace:HashMapTreeMap

<<interface>>

Map

HashMap TreeMap

Page 19: 4IT101 šestá přednáška

Deklarace a inicializace mapy

• Červeně označená část inicializace může být ve verzi Javy 7 vynechána (operátor diamant)

private Map <String, Long> pocetSlov = new HashMap<String, Long>();

private Map <Long, Osoba> telSeznam = new HashMap<Long, Osoba>();

private Map <DenVTydnu, Double> odpracovanoHodin = new TreeMap<DenVTydnu, Double>();

Page 20: 4IT101 šestá přednáška

Metody pro mapymetoda

V put (K key, V value)

V get (Object key)

V remove (Object key)

int size ( )

boolean containsKey (Object key)

boolean containsValue (Object value)

void clear ( )

Set<K> keySet ( )

Collection<V> values ( )

Set<Map.Entry<V,K>> entrySet ( )

Page 21: 4IT101 šestá přednáška

Vytvoření a naplnění mapy

Map <String, Integer> mapa = new HashMap<String,Integer>();

mapa.put("pes", 2);mapa.put("pes", 3);mapa.put("kočka", 1);mapa.put(“morče", 1);System.out.println(mapa);

{pes=3, morče=1, kočka=1}

String “pes”

String “kočka”

String “morče“

Integer “1“

Integer “2“

klíče hodnoty

Integer “1“

Page 22: 4IT101 šestá přednáška

mapa.put(druh, mapa.get(druh) + 1);

Integer pocetO = mapa.get("pes“);int pocetN = pocetO.intValue();Integer pocetVysl = new Integer(pocetN + 1);mapa.put("pes", pocetVysl);

se převede na následující operace

přičtení jedničky k hodnotě v mapě

Jak by vypadal rychlejší kód pro přičítání jedničky?

Page 23: 4IT101 šestá přednáška

Procházení mapy

• přes množinu klíčů – získá se metodou keySet()– pomocí cyklu for

– pomocí iterátoru – při rušení prvků

for (String klic : mapa.keySet() ){System.out.println(klic+"\t"+mapa.get(klic));

}

Page 24: 4IT101 šestá přednáška

Mapa seznamů

5801 Pepa

5802 Vašek Dušan

5804 Luboš Jarmila

5805 Renata

5806

Map <Integer, List<String> > telSeznam;telSeznam = new HashMap<Integer, List<String>> ();

Page 25: 4IT101 šestá přednáška

void pridejPrvek(int telCislo, String jmeno) { if (mapa.containsKey(telCislo)){ List <String> seznamJmen = mapa.get(telCislo); seznamJmen.add(jmeno); } else { List <String> seznamJmen = new ArrayList<String>(); seznamJmen.add(jmeno); mapa.put(telCislo, seznamJmen); }}

public void vypisSeznam (){ Set<Integer> seznamKlicu = mapa.keySet(); for (Integer telCislo :seznamKlicu){ List <String> seznamJmen = mapa.get(telCislo); System.out.print(telCislo + "\t\t"); for(String jmeno : seznamJmen) { System.out.print(jmeno +", "); } System.out.println(); }}

Page 26: 4IT101 šestá přednáška

Procházení seznamů

1. Pomocí cyklu for („for each“)seznamy, množiny, pole

2. Pomocí indexů v cyklu for pouze seznamy (List) a pole

3. Přes iteratorseznamy, množiny

Page 27: 4IT101 šestá přednáška

Procházení kolekce - “for each”

for (typ identifikátor : kolekce) {příkaz;

}for (String zvire : seznam){

System.out.println(zvire);}

for (String zvire : mnozina){System.out.println(zvire);

}

Page 28: 4IT101 šestá přednáška

Procházení seznamu s využitím indexů

for (int i = 0; i < seznam.size(); i++) {System.out.println ("" + i + ". " + seznam.get(i));

}

0. morče1. kočka2. pes

Page 29: 4IT101 šestá přednáška

Odebírání ze seznamů a množin

public void odeber(String druh) { for(String zvire : seznam){ if (zvire.equals(druh)){ seznam.remove(druh); } }}

java.util.ConcurrentModificationException

Page 30: 4IT101 šestá přednáška

Rozhraní (interface) Iterator<E>

• hasNext()• next()• remove()

public void odeber(String druh){ Iterator<String> ukazovatko = seznam.iterator(); while (ukazovatko.hasNext()) { String zvire = ukazovatko.next(); if (zvire. equals(druh)){ ukazovatko.remove(); } } }

identifikátor iterátoru !!!!

Page 31: 4IT101 šestá přednáška

Znaky a textové řetězce

Znaky a textové řetězce

Page 32: 4IT101 šestá přednáška

Znaky• primitivní typ char, Unicode, 2B

char cSHackem = ’č’;char nejakyZnak = ’\u12ab’;

• matematické operace – lze přičítat/odečítat pozice v tabulce Unicode

• obalová třída Character– též statické metody pro znaky

static boolean isDigit(char c);static boolean isLetter(char c);static boolean isLowerCase(char c);static char toLowerCase(char c);static char toUpperCase(char c);

Page 33: 4IT101 šestá přednáška

Escape znaky

\t tabulátor\n nový řádek\“ uvozovky\’ apostrof\\ zpětné lomítko\uxxxx vložení znaku Unicode

Page 34: 4IT101 šestá přednáška

Národní znaky a překladač

• různá kódování : ISO-8859-2, CP1250, UTF8

javac –encoding utf8 Trida.java

• native2ascii – převede do přenositelného tvaru:"čeština" => "\u00c4\u0164e\u0139\

u02c7tina"

Page 35: 4IT101 šestá přednáška

Třída StringString str = “abc”;

String str = new String(“abc”);

spojování řetězcůstr = str + “def”;

připojování dalších typůstr = “vysledek “ + 5;str = “výsledek “ + 3 + 5;str = “výsledek “ + (3 + 5);str = “Účet: “ + mujUcet;

String.valueOf()

o.toString()

read-only třída

Page 36: 4IT101 šestá přednáška

Metody třídy String

int length()

boolean equals(String str)boolean equalsIgnoreCase(String

str)boolean endsWith(String koncovka)boolean startsWith(String str)

Page 37: 4IT101 šestá přednáška

Co vypíše následující kód?public class Porovnani { public static void main(String[] args) { String ret1 = "length: 10"; String ret2 = "length: " + 10; String ret3 = "length: "+ret1.length();

System.out.println(ret1 == ret2); System.out.println(ret1 == ret3); System.out.println(ret2 == ret3); }}

truetruetrue

falsefalsefalse

truefalsefalse

Page 38: 4IT101 šestá přednáška

Metody pro práci s řetězci

String toLowerCase()String toUpperCase()

String substring(int beginIndex) String substring(int beginIndex, int endIndex)

int indexOf(String str)

char[] toCharArray()

Page 39: 4IT101 šestá přednáška

Formátování řetězců• metoda format() ve třídě String, metody

printf() u výstupních operací (PrintStream či PrintWriter),

• interně se používá třída java.util.Formatter

příklady:

String vystup = String.format("strana: %d/%d“, strana, pocetStran);

System.out.printf("úhly – alfa: %f6.4, beta: %f6.4, gama: %f6.4%n“, alfa, beta, gama);

System.out.printf("%-30s %2d %f4.2%n", prijmeni, semestr, prumer);

Page 40: 4IT101 šestá přednáška

Formátování řetězců• specifikace formátu

%[argument_index$][příznaky][šířka][.přesnost]konverzekonverze:

d celé číslo v dekadickém tvarux, h celé číslo hex,f desetinné číslog desetinné číslo, u velkých čísel vědecký

formátt formátování datumu a časub booleans text, výsledek toString(), popř. null

příznaky- zarovnání vlevo0 vypíše se úvodní nula+ u čísel i znaménko +, vloží se oddělovač řádů dle národního

prostředí

Page 41: 4IT101 šestá přednáška

Lokalizace• některé operace s textem závisí na

nastavení jazyka a země, tzv. Locale,

• třída java.util.Locale,• Metody závislé na Locale:

– format(),– toLowerCase,– toUpperCase()

• při spuštění JVM se nastaví defaultní Locale,

Page 42: 4IT101 šestá přednáška

StringBuffer StringBuilder

• pomocné třídy pro práci s řetězci• „rychlejší“ operace s řetězci,

int length()StringBuffer append(String str)StringBuffer append(Object o)StringBuffer insert(int pozice, String str)StringBuffer insert(int pozice, Object o)StringBuffer delete(int zacatek, int konec)String toString()String substring(int beginIndex)String substring(int beginIndex, int endIndex)

Page 43: 4IT101 šestá přednáška

Použití třídy StringBuffer

for (String klic: mapa.keySet()) {StringBuffer sb = new StringBuffer();sb.append("zvire ");sb.append(klic);sb.append(", pocet kusu ");sb.append(mapa.get(klic)).toString();String radek = sb.toString();

}

for (String klic: mapa.keySet()) {String radek = "zvire "+klic+", pocet kusu "+mapa.get(klic);

}

Page 44: 4IT101 šestá přednáška

Použití třídy StringBuilder

StringBuilder sb = new StringBuilder(60);for (String klic: mapa.keySet()) {

sb.delete(0, sb.length());sb.append("zvire ").append(klic);sb.append(", pocet kusu ").append(mapa.get(klic));String radek = sb.toString();

}

Page 45: 4IT101 šestá přednáška

Regulární výrazy

• od verze 1.4• regulární výraz je posloupnost

znaků a symbolů, která definuje skupinu textových řetězců.

• balíček java.util.regex:– třídy Pattern a Matcher– výjimka PatternSyntaxException

• rozšíření třídy String

Page 46: 4IT101 šestá přednáška

Třídy Pattern a Matcher

Pattern p = Pattern.compile("a*b");Matcher m = p.matcher("aaaaab");boolean b = m.matches();

Page 47: 4IT101 šestá přednáška

Metody třídy String využívající regulární výrazy

matches(String vzor)replaceAll(String vzor, String repl)replaceFirst(String vzor, String repl)split(String vzor) split(String vzor, int n)

Page 48: 4IT101 šestá přednáška

Syntaxe regulárních výrazů

• jednotlivé znaky:x konkrétní znak\\ zpětné lomítko (jeden znak)\0n znak zadaný pomocí oktalové soustavy

(0-377)\xhh znak zadaný pomocí hexadecimální soustavy\uhhhh znak z Unicode zadaný pomocí hexadecimální

soustavy\t tabelátor\n znak LF (linefeed, newline)\r znak CR (carriage-return)\e znak escape

Page 49: 4IT101 šestá přednáška

Syntaxe regulárních výrazů

• množiny znaků, tj jeden ze znaků v zadané množině[abc] jednoduchá množina (tj. jeden ze znaků a b c)[^abc] negace, tj. žádný ze znaků a b c,[a-zA-Z] rozsah znaků (znaky a až z a znaky A-Z). (tečka) libovolný znak\d číslice, tj. [0-9]\D nečíslice, tj. [^0-9]\s “netisknutelné” znaky, tj mezera,

tabelátor, znaky konce řádku a konce stránky,\S opak \s

Page 50: 4IT101 šestá přednáška

Syntaxe regulárních výrazů

• označení hranic^ začátek řetězce$ konec řetězce\b hranice slova

• znaky opakování? předchozí znak bude 1x nebo 0x,* 0 a více opakování předchozího

znaku,+ předchozí znak je minimálně

jedenkrát,{n} přesně n opakování předchozího

znaku,{n,} minimálně n opakování předchozího znaku,{m,n} minimálně m a maximálně n opakování

předchozího znaku,

Page 51: 4IT101 šestá přednáška

Syntaxe regulárních výrazů

• další operátoryXY znaky X a Y musí být vedle

sebe,X|Y buď znak X nebo znak Y,(X) označení skupiny,\n obsah n-té skupiny,

Page 52: 4IT101 šestá přednáška

Zápis regulárního výrazu v Javě

• V regulárním výrazu zapsaném ve zdrojovém textu musí být všechny \ zdvojené:

"\\s+"" [0-9]+"

Page 53: 4IT101 šestá přednáška

Příklady regulárních výrazů

• Zadání: Napište regulární výraz, který odpovídá řetězci "ahoj"

ahoj if (retezec.matches("ahoj")) {vhodnější je

if (retezec.equals("ahoj"))

Page 54: 4IT101 šestá přednáška

Příklady regulárních výrazů

• Zadání: Napište regulární výraz, pomocí kterého je možno najít přebytečné mezery v textu

\s+ if (retezec.matches("\\s+")) {

Page 55: 4IT101 šestá přednáška

Příklady regulárních výrazů

• napište regulární výraz, pomocí kterého lze zjistit, zda řetězec obsahuje pouze číslice

[0-9]+

if (retezec.matches("[0-9]+")) {

Page 56: 4IT101 šestá přednáška

Příklady regulárních výrazů

• Zadání: napište regulární výraz pro kontrolu, zda řetězec je desetinné číslo ve formátu z desetinnou tečkou.

-?\d+\.\d+

-?[0-9]+\.[0-9]+

Page 57: 4IT101 šestá přednáška

Příklady regulárních výrazů

• napište regulární výraz, který bude sloužit ke kontrole formátu rodného čísla s lomítkem.

[0-9]{6}/[0-9]{3,4}

if (retezec.matches("[0-9]{6}/[0-9]{3,4}")) {

Page 58: 4IT101 šestá přednáška

Náhrada řetězců

String retezec = "vstupní řádek";String normalizovany = retezec.replaceAll(" +"," ");

radek = radek.replaceAll(" (knihu)|(knize) "," kniha ");

mezera

Page 59: 4IT101 šestá přednáška

Dělení řetězce na části – metoda split()

String retezec = "seber knihu";String [] poleSlovPrikazu = retezec.split(" "); if (poleSlovPrikazu.length >0 ) { slovo1 = poleSlovPrikazu[0]; // první slovo } if (poleSlovPrikazu.length >1 ) { slovo2 = poleSlovPrikazu[1]; // druhé slovo }