4IT101 7.přednáška

41
4IT101 7.přednáška Třída String a regulární výrazy Algoritmy v kolekcích Vnitřní a vnořené třídy

description

4IT101 7.přednáška. Třída String a regulární výrazy Algoritmy v kolekcích Vnitřní a vnořené třídy. Třída String. Specielní konstanty Přetížený operátor + Read only třída – žádná metoda nemění obsah řetězce, vždy vrací novou instanci Porovnávání obsahů řetězců podle equals () ne ==. - PowerPoint PPT Presentation

Transcript of 4IT101 7.přednáška

Page 1: 4IT101  7.přednáška

4IT101 7.přednáška

Třída String a regulární výrazyAlgoritmy v kolekcíchVnitřní a vnořené třídy

Page 2: 4IT101  7.přednáška

Třída String• Specielní konstanty• Přetížený operátor +• Read only třída – žádná metoda

nemění obsah řetězce, vždy vrací novou instanci

• Porovnávání obsahů řetězců podle equals() ne ==

Page 3: 4IT101  7.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 4: 4IT101  7.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 5: 4IT101  7.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 6: 4IT101  7.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 7: 4IT101  7.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 8: 4IT101  7.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 9: 4IT101  7.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 10: 4IT101  7.přednáška

Třídy Pattern a Matcher

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

Page 11: 4IT101  7.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 12: 4IT101  7.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 13: 4IT101  7.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 14: 4IT101  7.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 15: 4IT101  7.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 16: 4IT101  7.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 17: 4IT101  7.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 18: 4IT101  7.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 19: 4IT101  7.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 20: 4IT101  7.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 21: 4IT101  7.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 22: 4IT101  7.přednáška

Náhrada řetězců

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

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

mezera

Page 23: 4IT101  7.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 }

Page 24: 4IT101  7.přednáška

Třídění v kolekcích

Page 25: 4IT101  7.přednáška

Kolekce - třídění• řazení (porovnávání):

– rozhraní Comparable– rozhraní Comparator

• algoritmus pro třídění– Collections.sort(List seznam)– Arrays.sort() ...– TreeSet

<<interface>>Collection

<<interface>>List

<<interface>>Set

HashSet TreeSetArrayList LinkedListCollectionsArrays

Page 26: 4IT101  7.přednáška

Rozhraní Comparable<T>

• přirozené řazení• předepisuje jedinou metodu

int compareTo ( T o )

• výsledek porovnání:0 rovná se<0 menší než parametr>0 větší než parametr

• mnoho tříd implementuje rozhraní Comparable

Page 27: 4IT101  7.přednáška

Implementace rozhraní Comparable ve třídě Ucet

public class Ucet implements Comparable<Ucet>{private int cisloUctu;private String vlastnik;private double stav = 0;

public int compareTo(Ucet druhyUcet){if (this.cisloUctu == druhyUcet.cisloUctu){

return 0;}else {

if (this.cisloUctu < druhyUcet.cisloUctu){return -1;

}else {

return 1;}

}}

Page 28: 4IT101  7.přednáška

Rozhraní Comparable• Používá se při vytváření TreeMap nebo

TreeSet, při třídění v polích a listech pomocí:Arrays.sort( pole )Collections.sort( seznam )

• Též pro hledání maxima/minima:Collections.max( kolekce );Arrays.min( pole );

• Je vhodné, aby pro dvě instance, pro které equals() vrací true, vracela metoda compareTo() nulu.

Page 29: 4IT101  7.přednáška

Collections.max

Collections <<interface>>Comparable

Ucet

List

ArrayList

public static T max(Collection<T> coll) {Iterator<T> i = coll.iterator();T candidate = i.next();

while(i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) > 0)

candidate = next;}return candidate;

}

zjednodušena deklarace generických typů

Page 30: 4IT101  7.přednáška

Rozhraní Comparator• deklaruje metodu

int compare ( T prvni, T druhy );

• obvykle se implementuje v pomocné třídě

deklarace rozhraní:

package java.util;

public interface Comparator<T> {int compare(T o1, T o2); boolean equals(Object obj);

}

Page 31: 4IT101  7.přednáška

import java.util.Comparator;

class PorovnavaniUctuDleAbecedy implements Comparator<Ucet> {public int compare (Ucet prvni, Ucet druhy){

String vlastnikPrvni = prvni.getVlastnik();String vlastnikDruhy = druhy.getVlastnik();return vlastnikPrvni.compareTo(vlastnikDruhy);

}}

Collections.sort(seznamUctu, new PorovnavaniUctuDleAbecedy());

Set mnozinaUctu = new TreeSet(new PorovnavaniUctuDleAbecedy());

Page 32: 4IT101  7.přednáška

import java.util.Comparator;class PorovnavaniUctuDleStavu implements Comparator<Ucet> {

public int compare (Ucet prvni, Ucet druhy){if (prvni.getStav() == druhy.getStav()) {

return 0;}else {

if (prvni.getStav() > druhy.getStav()) {return 1;

}else {

return -1;}

}}

}

Ucet ucetSNejvyssimStavem = Collections.max(seznamUctu, new PorovnavaniUctuDleStavu());

Page 33: 4IT101  7.přednáška

Vnitřní a vnořené třídy

Page 34: 4IT101  7.přednáška

public class Jmeno {Datové atributyStatické datové atributy

Statické metodyKonstruktoryMetody

Vnitřní třídyStatické vnitřní třídy (vnořené)

}

TřídaDatové členy

Funkční členy

Typové členy

Page 35: 4IT101  7.přednáška

Více tříd v jednom zdrojovém souboru

• Několik samostatných tříd uložených v jednom souboru s koncovkou java

• A.class• B.class• C.class

• V souboru je jedna třída obsahující další

• A.class• A$B.class• A$C.class

public class A

class Bclass C

public class Aclass B

class C

A.java

A.java

Page 36: 4IT101  7.přednáška

Charakteristika• Třídy definované uvnitř jiných tříd• Mohou být potomky libovolné viditelné

třídy a implementovat libovolné viditelné rozhraní

• Jsou uvnitř svých vnějších tříd, a proto vidí i na jejich soukromé členy

• Mohou mít nastaveny kterýkoliv modifikátor přístupu (public, protected, „package private“, private)

Page 37: 4IT101  7.přednáška

Rozdělení • Globální (na úrovni atributů a

metod)– vnitřní - inner– vnořené – embendded

• Lokální (uvnitř metod a bloků kódu)– pojmenované– anonymní

Page 38: 4IT101  7.přednáška

Vnořené třídy

• Deklarovány s modifikátorem static• Mohou být vnořené i do rozhraní • Jsou to zcela obyčejné třídy

se všemi jejich možnostmi a omezeními

Page 39: 4IT101  7.přednáška

Vnitřní třídy• Instance vnitřní třídy jsou navázány

na instanci vnější třídy• Získání instance vnější třídy: Vnější.this• Nesmějí mít statické atributy a metody –

nevědělo by se, jak moc jsou statické– Pouze v rámci napojené instance– V rámci celé vnější třídy

Page 40: 4IT101  7.přednáška

public class Banka{ // deklarace datových atributů ...........

private class PorovnavaniUctuDleAbecedy implements Comparator<Ucet> {public int compare (Ucet prvni, Ucet druhy){

String vlastnikPrvni = prvni.getVlastnik();String vlastnikDruhy = druhy.getVlastnik();return vlastnikPrvni.compareTo(vlastnikDruhy);

} } private class PorovnavaniUctuDleStavu implements Comparator<Ucet> {

public int compare (Ucet prvni, Ucet druhy){if (prvni.getStav() == druhy.getStav()) {

return 0;}else {

if (prvni.getStav() > druhy.getStav()) {return 1;

}else {

return -1;}

}}

}..........................................Collections.sort(seznamUctu, new PorovnavaniUctuDleAbecedy());..........................Ucet ucetSNejvyssimStavem = Collections.max(seznamUctu,

new PorovnavaniUctuDleStavu());............................................

Page 41: 4IT101  7.přednáška

Anonymní vnitřní třídy• Deklarují se uvnitř metody,

většinou jako parametr volané metody.

• Mají pouze implicitní konstruktor.• Překladem vznikne samostatný

soubor class pojmenovaný Vnější$pořadové číslo např. Banka$1.class

Collections.sort(seznamUctu, new PorovnavaniUctuDleAbecedy());

Collections.sort(seznamUctu, new Comparator<Ucet>(){public int compare (Ucet prvni, Ucet druhy){

String vlastnikPrvni = prvni.getVlastnik();String vlastnikDruhy = druhy.getVlastnik();return vlastnikPrvni.compareTo(vlastnikDruhy);

} } );