4it101 7.přednáška
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 PresentationTRANSCRIPT
![Page 1: 4IT101 7.přednáška](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/24.jpg)
Třídění v kolekcích
![Page 25: 4IT101 7.přednáška](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/33.jpg)
Vnitřní a vnořené třídy
![Page 34: 4IT101 7.přednáška](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062222/568165a5550346895dd88a85/html5/thumbnails/41.jpg)
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);
} } );