14. Řetězce Řetězce jsou v Javě reprezentovány instancemi tříd StringBuffer a
String (z balíku java.lang). Objekt typu String je
konstantní řetězec (nelze ho modifikovat). Pokud potřebujeme vytvořit
řetězec, který lze libovolně měnit, musíme pro něj použít objekt typu
StringBuffer. S instancemi třídy String zachází v některých případech kompilátor jako by to byly
primitivní typy. Například pokud narazí ve zdrojovém textu na text uzavřený
v uvozovkách, vytvoří pro něj automaticky objekt typu String. Rovněž
operátor "+" slouží pro spojování řetězců.
14.1. Třída StringVytvoření konstantního řetězce lze provést dvěma způsoby:
String text1 = "Ahoj světe.";
String text2 = new String("I love TeX.");
Třída String obsahuje řadu metod pro práci s řetězci
(uvedeny jsou jen některé):
- Veřejné konstruktory:
String(),
String(String s), String(char ch[]), String(char ch[], int
od, int poc), String(StringBuffer sb),
String(byte[] pole, String kódování) - vytvoří řetězec konverzí
z pole obsahujícího znaky v zadaném kódování (např. "UTF8", "ISO8859_2", "Cp1250" a dalších (1) ),
- public char charAt(int i) - vrací znak, který se nalézá na zadané
pozici i,
- public int compareTo(String s) - porovná lexikograficky
dva řetězce a vrací 0, pokud jsou si řetězce rovny, zápornou hodnotu, pokud je
řetězec s "menší", nebo kladnou nenulovou hodnotu, pokud je řetězec
s "větší",
- public int length() - vrací aktualní délku řetězce,
- public String replace(char zi1, char zi2) - zamění všechny
výskyty znaku zi1 za znak zi2,
- public String substring(int si, int ei), String
substring(int si) - vytvoří nový řetězec jehož obsahem je podřetězec
začínající indexem si a zahrnující zbytek řetězce, nebo podřetězec
začínající indexem si a končící indexem (ei-1),
- public String concat(String s) - spojí dva
řetězce (obdoba operátoru "+"),
- public String trim() - odstraní bílé znaky na začátku a konci
řetězce, (2)
- public char[] toCharArray() - převede řetězec
na pole znaků,
- public String toLowerCase() - provede konverzi velkých písmen na
malá,
- public String toUpperCase() - provede konverzi malých písmen na
velká,
- public int indexOf(int ch), indexOf(String S),
indexOf(int ch, int od), indexOf(String S, int od) -
vrací pozici prvního výskytu znaku nebo podřetězce v řetězci,
- public int lastIndexOf(int ch),
lastIndexOf(String s),
lastIndexOf(int ch, int od),
lastIndexOf(String s, int od)
- vrací pozici posledního výskytu znaku nebo podřetězce v řetězci.
| Priklad 14.1. |
String text1 = " AhOJ BlaBlA ";
String text2 = text1.toUpperCase(); // text2 = " AHOJ BLABLA "
String text3 = text2.trim(); // text3 = "AHOJ BLABLA"
|
|
14.2. Třída StringBufferTřída StringBuffer je definována v balíku java.lang. Na rozdíl od
třídy String lze řetězec tohoto typu modifikovat (automaticky se též
mění jeho délka). Modifikovatelnosti třídy StringBuffer využívá
i překladač, který sekvenci:
x = "0x"+2
přeloží jako
x = new StringBuffer.append("0x").append(2).toString();
Řetězec typu StringBuffer lze vytvořit konstruktory:
- public StringBuffer(String str) - inicializuje
StringBuffer řetězcem str,
- public StringBuffer(int velikost) - vytvoří
StringBuffer
o počáteční kapacitě velikost znaků,
- public StringBuffer() - vytvoří
StringBuffer o implicitní
počáteční kapacitě.
Pro práci s řetězcem typu StringBuffer jsou k dispozici
metody:
- public StringBuffer append(parametr) - přidá parametr na konec řetězce,
- public int capacity() - vrací kapacitu řetězce,
- public void ensureCapacity(int velikost) - zajistí, aby
StringBuffer měl kapacitu alespoň velikost znaků,
- public int getChars(int c1, int c2, char[] pole, int idx) -
nakopíruje znaky od pozice c1 do c2 do pole od indexu idx,
- public StringBuffer insert(int i,parametr) - vloží
parametr na pozici i,
- public char charAt(int i) - vrací znak na zadané pozici,
- public int length() - vrací aktuální délku řetězce,
- public StringBuffer reverse() - vytvoří
StringBugger
obsahující původní znaky v opačném pořadí,
- public void setCharAt(int i, char ch) - změní znak na pozici i,
- public void setLength() - nastaví novou délku řetězce,
- public String toString() - zkonvertuje obsah na
String,
Metody append() a insert() umožňují zadat jako parametr
všechny primitivní datové typy, objekt typu String a pole znaků. Z tohoto
důvodu nejsou uvedeny všechny varianty metod.
14.3. Konverze hodnoty datového typu na řetězecVelmi často potřebujeme převést řetězec na číselnou hodnotu nebo naopak.
K převodu z hodnoty primitivního datového typu na řetězec nabízí třída String
několik verzí statické metody valueOf() (3) :
String valueOf( primitivníDatovýTyp proměnná )
String valueOf(Object obj)
String valueOf(char[] data)
String valueOf(char[] data, int pocatek, int pocet)
Parametry:
- data - pole znaků,
- pocatek - pozice v poli, odkud se má začít konvertovat,
- pocet - počet převáděných znaků.
| Priklad 14.2. |
String text = String.valueOf(3.1415);
System.out.println("Tak vypadá šestnáctka:"+16);
|
|
14.4. Konverze řetězce na hodnotu datového typuPro převod řetězce na hodnotu datového typu je zapotřebí použít metod ze tříd
Byte, Integer, Long, Double, Float,
Boolean, Short z balíku java.lang (4)
umožňující pracovat s primitivními datovými typy jako s objekty. Všechny tyto
třídy obsahují příslušnou verzi metody valueOf(), která vrací
řetězec zkonvertovaný na příslušnou třídu datového typu:
public static Integer valueOf(String s)
public static Integer valueOf(String s, int zaklad)
public static Double valueOf(String s)
public static Float valueOf(String s)
public static Long valueOf(String s)
public static Long valueOf(String s, int zaklad)
public static Boolean valueOf(String s)
public static Byte valueOf(String s)
public static Byte valueOf(String s, int zaklad)
public static Short valueOf(String s)
public static Byte valueOf(String s, int zaklad)
Parametry:
- s - je konvertovaný řetězec,
- zaklad - udává základ číselné soustavy (není-li uveden, je
zvolena soustava desítková).
Všechny tyto metody navíc vyvolávají výjimku
NumberFormatException v případě chybného formátu řetězce s.
Po vytvoření instance je třeba ještě provést konverzi na primitivní datový typ
některou z metod:
public int intValue()
public long longValue()
public float floatValue()
public double doubleValue()
public boolean booleanValue()
public byte byteValue()
public byte shortValue()
Třídy Byte, Integer, Short a Long nabízí
navíc metody pro převody:
- public static byte parseByte(String s) - na byte
z desítkové soustavy,
- public static byte parseByte(String s, int zaklad) - na
byte z libovolné soustavy.
- public static int parseInt(String s) - na int
z desítkové soustavy,
- public static int parseInt(String s, int zaklad) - na int
z libovolné soustavy,
- public static short parseShort(String s) - na short
z desítkové soustavy,
- public static short parseShort(String s, int zaklad) - na
short z libovolné soustavy.
- public static long parseLong(String s) - na long
z desítkové soustavy,
- public static long parseLong(String s, int zaklad) - na
long z libovolné soustavy.
| Priklad 14.3. |
double cislo = new Double("3.1415").doubleValue(); // (1)
boolean flag = Boolean.valueOf("FALSE").booleanValue();
int cislo1 = Integer.valueOf("dead",16).intValue();
long cislo2 = Long.parseLong("bed",16);
Na řádce (1) je pro vytvoření instance třídy Double použit
její konstruktor namísto statické metody Double.valueOf(). Oba způsoby
jsou ekvivalentní. |
|
|