4it101 šestá přednáška
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 PresentationTRANSCRIPT
4IT101šestá přednáška
4IT101šestá přednáška
Statické prvky třídyStatické prvky třídy
Statické proměnnéDatové atributyStatický inicializační blokStatické metodyMetodyKonstruktoryVnitřní třídyStatické vnitřní třídy
Třída (další prvky)
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
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; }}
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.
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
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)
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
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)
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ů)
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().
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){
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
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
MapyMapy
Datové struktury pro uložení dvojice klíč - hodnota
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
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
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>();
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 ( )
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“
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?
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));
}
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>> ();
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(); }}
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
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);
}
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
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
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 !!!!
Znaky a textové řetězce
Znaky a textové řetězce
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);
Escape znaky
\t tabulátor\n nový řádek\“ uvozovky\’ apostrof\\ zpětné lomítko\uxxxx vložení znaku Unicode
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"
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
Metody třídy String
int length()
boolean equals(String str)boolean equalsIgnoreCase(String
str)boolean endsWith(String koncovka)boolean startsWith(String str)
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
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()
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);
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í
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,
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)
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);
}
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();
}
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
Třídy Pattern a Matcher
Pattern p = Pattern.compile("a*b");Matcher m = p.matcher("aaaaab");boolean b = m.matches();
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)
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
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
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,
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,
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]+"
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"))
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+")) {
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]+")) {
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]+
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}")) {
Náhrada řetězců
String retezec = "vstupní řádek";String normalizovany = retezec.replaceAll(" +"," ");
radek = radek.replaceAll(" (knihu)|(knize) "," kniha ");
mezera
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 }