Počítače a programování 1 8.přednáška
Obsah přednášky Řetězce - deklarace a vytvoření Základní metody pro práci s řetezci Znaky - třída Character Základní metody pro práci se znaky
Řetězce Základní pojmy: Řetězec je posloupnost znaků V Javě je řetězec samostatný objekt a ne pole znaků jako v jiných programovacích jazycích V Javě existují dva typy řetězců : Konstantní (instance třídy String ) – jednou vytvořený řetřzec již nelze měnit Řetězec proměnné délky (instance třídy StringBuffer) – délku řetězce je možné během výpočtu měnit Existují konverze mezi oběma typy V obou případech překročení mezí řetězce = výjimka StringIndexOutOfBoundsException
Vytvoření řetězce Deklarace řetězce a vytvoření String pozdrav = ”Hi, there!” Kromě základního vytvoření řetězce existuje řada dalších konstruktorů – viz příklady Index znaku uvnitř řetězce je celočíselný a začíná hodnotou 0
Příklad vytvoření řetězců char[] znaky = {'E', 'v', 'a'}; char[] cbajty = {'M', 'a', 'r', 't', 'i', 'n', 'a'}; StringBuffer buf = new StringBuffer("dobry den"); s1 = new String("cao"); System.out.println("s1:" + s1); s2 = new String(s1); s3 = new String(znaky); s4 = new String(znaky, 1, 2); s5 = new String(bajty); s6 = new String(bajty, 3, 4); s7 = new String(buf);
Příklad vytvoření řetězců Vytiskneme-li předchozí řetězce např pomocí System.out.println("s1:" + s1); dostaneme: S1:cao S2:cao S3:Eva S4:va S5:Martina S6:tina S7:dobry den
Řetězce Zjištění aktuální délky řetězce – metoda length() System.out.println("s7 = " + s7.length ); vypíše s7=9 Inicializované pole řetězců String[] pole = {"Dana", "Eva", "Martina"}; for (int i = 0; i < pole.length; i++) System.out.println(pole[i]);
Práce s celými řetězci - porovnávání compareTo(String s) – porovná lexikograficky dva řetězce compareToIgnoreCase(String s) – porovná lexikograficky dva řetězce, nerozlišuje velká a malá písmena Obě metody vrací int číslo s hodnotou : 0 jsou-li řetězce shodné < 0 je-li s větší > 0 je-li s menší
Řetězce – porovnávání equals(String s) – zjistí zda jsou řetězce shodné equalsIgnoreCase(String s) - zjistí zda jsou řetězce shodné, neuvažuje velká a malá písmena Obě metody vrací true v případě shody obou řetězců false v případě neshody
Řetězce – převody malá/velká písmena toLowerCase() – převádí všechny znaky řetězce na malá písmena toUpperCase – převádí všechny znaky řetězce na velká písmena Příklad: String s = ” mala a VELKA”; System.out.println(s.toLowerCase()); // mala a velka System.out.println(s.toUpperCase()); // MALA A VELKA
Řetězce - spojení Je možné použít buď operátor + nebo metodu concat(String s). V obou případech se vytvoří řetězec třetí – spojované řetězce se nezmění Př: String s1 = ”mala a”; String s2 = ”VELKA”; String s3,s4; s3 = s1 + s2; s4 = s1.concat(s2); System.out.println(s3); // ” mala a VELKA ” System.out.println(s4); // ” mala a VELKA ”
Náhrada znaků v řetězci replace(char oldchar, char newchar) – nahradí všechny výskyty znaku oldchar znakem newchar, vytvoří nový řetězec s nahrazenými znaky Příklad: String s2, s1 = ”cacao”; s2 = s1.replace(’c’,’k’); System.out.println(s1); // ”cacao” System.out.println(s2); // ”kakao”
Práce s částí řetězce substring(int beginIndex) – vrací nový řetězec, který je podřetězcem původního a začíná v pozici beginIndex substring(int beginIndex, int endIndex) – vrací nový řetězec, podřetězec původního, který začíná v pozici beginIndex a končí v pozici endIndex-1 Příklad: String s2, s3, s1 = ”mala a VELKA”; s2 = s1.substring(5); s3 = s1.substring(5,9); System.out.println(s2); // ”a VELKA” System.out.println(s3); // ”a VE ”
Práce s částí řetězce getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) kopíruje znaky z řetězce do pole znaků dst. Znaky řetězce jsou kopírovány od pozice srcBegin do pozice srcEnd-1. V poli dst se znaky ukládají počínaje pozicí dstBegin. !!! Pozor !!! v následujících případech muže dojít k výjimce IndexOutOfBoundsException : IndexOutOfBoundsException 1. srcBegin je záporné 2. srcBegin je větší než srcEnd 3. srcEnd je větší než délka řetězce 4. dstBegin je záporné 5. dstBegin+(srcEnd-srcBegin) je větší než dst.length
Práce se začátkem a koncem řetězce startsWith(String pr) – vrací true pokud řetězec začína s prefixem pr endWidth(String sf) – vrací true pokud řetězec končí suffixem sf Příklad: String s = "mala a VELKA"; if (s.startsWith("mala") == true) System.out.println("Zacina na \"mala\""); if (s.endsWith("mala") == false) System.out.println("Nekonci na \"mala\""); Vypíše: Zacina na ”mala” Nekonci na ”mala”
Oříznutí bílých znaků na okrajích Pokud pracujeme s řetězcem načteným ze vstupu potřebujeme se zbavit bílých znaků na okrajích řetezce trim() – metoda vrací kopii řetězce ze kterého byly odebrány bílé znaky (mezery, tabulátory,nové řádky) Příklad: String s2, s1 = "\r\n\t ahoj\t \r\n"; s2 = s1.trim(); System.out.println("Zacatek:" + s1 + ":konec"); System.out.println("Zacatek:" + s2 + ":konec"); Vypíše: Zacatek: ahoj :konec Zacatek:ahoj:konec
Práce s jednotlivými znaky řetězce – získání znaku charAt( int index) –vrací znak řetězce v pozici index !!! Pozor !!! Může dojít k výjimce IndexOutOfBoundsException, pokud je hodnota proměnné záporná nebo větší než délka řetězceIndexOutOfBoundsException Příklad: String s = "mala a VELKA"; System.out.println(s.charAt(7)); // vytiskne znak V
Práce s jednotlivými znaky řetězce – hledání znaku int indexOf(String str) – vrací index prvního výskytu podřetězce str nebo -1 pokud se podřetězec v řetězci nevyskytuje int indexOf(String str, int fromIndex) – vrací index prvního výskytu podřetězce str nebo -1 pokud se podřetězec v řetězci nevyskytuje. Hledání podřetězce začíná v pozici fromIndex int lastIndexOf(int ch) – vrací index posledního výskytu znaku ch v řetězci nebo -1 pokud se znak v řetězci nevyskytuje int lastIndexOf(int ch, int fromIndex) – vrací index prvního výskytu znaku ch v řetězci (od pozice fromIndex směrem k počátku) nebo -1 pokud se znak v řetězci nevyskytuje.
Příklad: String s = "mala a VELKA"; int i; i = s.indexOf('a'); System.out.println("Prvni a je na " + i + ". pozici"); i = s.indexOf('a', i + 1); System.out.println("Dalsi a je na " + i + ". pozici"); i = s.lastIndexOf('a'); System.out.println("Posledni a je na " + i + ". pozici"); i = s.lastIndexOf('a', i - 1); System.out.println("Predposledni a je na "+ i +". pozici"); Vypíše: První a je na 1. pozici Další a je na 3. pozici Poslední a je na 5. pozici Predposledni a je na 3. pozici
Konverze základních datových typů na řetězec Jakýkoliv základní datový typ (od boolean po double) je možné konvertovat na řetězec pomocí statické metody valueOf() !!!Pozor!!! Metoda je statickou metodou třídy - je nutné ji volat jako String.valueOf(…) Pokud tiskneme pomocí System.out.println() volá se valueOf() automaticky Nejčastější použití – formátování výsledků před tiskem
Příklad použití valueOf() boolean b = true; int i = ; double d = Math.PI; String s; s = String.valueOf(b); System.out.println("b: " + s); s = String.valueOf(i); System.out.println("i: " + s); s = String.valueOf(d); System.out.println("d: " + s);
Formátování výsledků – pomocí valueOf() String s; int i; System.out.println(Math.PI); // s = String.valueOf(Math.PI); i = s.indexOf('.'); s = s.substring(0, i + 6); System.out.println(s); //
Konverze řetězce na základní datové typy Pro převod řetězce na základní datové typy se používají metody tříd Boolean, Byte, Short, Integer, Long, Float a Double z balíku java.lang – třídy obsahují metodu valueOf(String s), která vrací řetězec zkonvertovaný na objekt příslušného dat. typu – pak konverze metodou xxxValue() (xxx je odpovídající datový typ) Příklad : double d1 = Double.valueOf("3.14").doubleValue(); double d2 = new Double("3.14").doubleValue(); boolean b = Boolean.valueOf("true").booleanValue(); int i = Integer.valueOf("123").intValue();
Konverze řetězce na základní datové typy valueOf(String s, int radix) vrací hodnotu řetězce vyjádřenou v soustavě radix. Lze použít pouze pro třídy Byte, Short, Integer a Long parseXXX(String s) parseXXX(String s, int radix) – obě metody pracují podobně jako valueOf(). Lze použít pouze pro třídy Byte, Short, Integer a Long Příklad: long l1 = Long.parseLong("12345"); long l2 = Long.parseLong("1A2B", 16);
Volání více metod jedním příkazem Většina metod třídy String vrací objekt třídy String tj. vytvoří nový řetězec – metody je možné zřetězit bez uložení výsledku do pomocné proměnné Příklad: String s1 = "\r\n\t cacao\t \r\n"; int i; i = s1.trim().toUpperCase().substring(2).indexOf('O'); System.out.println("O je " + (i + 1) + ".znak"); Výsledek: "cacao" po trim() "CACAO" po toUpperCase() "CAO" po substring(2) a pak se hledá pozice znaku 'O'
Třída StringBuffer Poskytuje typ “měnitelný řetězec” – umožňuje libovolnou změnu jednotlivých znaků řetězce popř. změnu délky Konstruktory: StringBuffer() – vytvoří neinicializovaný řetězec s počáteční délkou 16 znaků StringBuffer(int length) – vytvoří neinicializovaný řetězec o počáteční délce length. !!!Pozor !!! - výjimka NegativeArraySizeException pokud je length menší než nula. NegativeArraySizeException StringBuffer(String str) – vytvoří inicializovaný řetězec o délce která je rovna str.length + 16 znaků. Řetězec je inicializován na sekvenci str. !!! Pozor !!! - výjimka NullPointerException pokud je str rovno null NullPointerException
Délka řetězce a změna kapacity int length() – vrací délku řetězce tj. počet znaků int capacity() – vrací kapacitu řetězce tj. maximální možnou délku void ensureCapacity(int k) – mění kapacitu řetězce následujícím způsobem: Je-li k menší než současná capacita zůstane řetězec nezměněn Je-li k větší než současná kapacita bude nová kapacita rovna maximu z velikosti k a z dvojnásobku současné kapacity + 2 znaky. void setLength(int k) – mění délku i kapacitu řetězce následovně: Je-li k větší než současná kapacita, zvětší se délka řetězce na k a kapacita na dvojnásobek současné kapacity + 2 znaky Je-li k menší než současná kapacita poonechá kapacitu nezměněnou a délku nastaví na k
Změna celého řetězce a jeho částí StringBuffer reverse() – otočí řetězec t.j pokud měl původní řetězec délku n bude se znak v pozici k po provedení metody reverse nacházet pozici n-k-1 StringBuffer append(typ t) – na konec původního řetězce je přidán řetězec odpovídající hodnotě t. Parametr t může být libovolný základní datový typ. StringBuffer delete(int start,int end) – odstraní znaky řetězce od pozice start do pozice end-1. StringBuffer deleteCharAt(int index) - zruší znak v pozici index. !!! POZOR!!! Výjimka StringIndexOutOfBoundsException je-li index záporný nebo větší než délka řetězce StringIndexOutOfBoundsException