Dione
Z. KotalaP. Toman: Java
Predchozi (Obsah) Dalsi

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 String

Vytvoření konstantního řetězce lze provést dvěma způsoby:

   String text1 = "Ahoj světe.";
   String text2 = new String("I love TeX.");

Pokud máme vytvořen objekt typu String můžeme na něj uplatnit následující veřejné metody (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),

  • public char charAt(int i) - zjistí 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, (1)

  • 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();
String text3 = text2.trim();

14.2. Třída StringBuffer

Třída StringBuffer je definována v balíku java.lang. Na rozdíl od třídy String lze řetězec tohoto typu modifikovat. 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
Pro deklaraci proměnné lze použít tento zápis:

   StringBuffer text = new StringBuffer("Linux.");

Pokud chceme vytvořit modifikovatelný řetězec o určité délce zvolíme tuto deklaraci:

   StringBuffer text = new StringBuffer(100);

Pro práci s řetězcem typu StringBuffer jsou k dispozici metody:

  • public StringBuffer append(...) - přidá na konec řetězce řetězec,

  • public int capacity() vrací maximální možnou délku řetězce (kapacitu),

  • public char charAt(int i) - vrací znak na zadané pozici,

  • public StringBuffer insert(int i,...) - vloží řetězec na pozici i,

  • public int length() - vrací aktuální délku řetězce,

  • 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 StringBuffer 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 těchto metod, a místo parametru je uveden symbol tří teček.

14.3. Konverze hodnoty datového typu na řetězec

Velmi č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(): (2)

   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 typu

Pro 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 (3) 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í.


  • (1) Znaky \u0000\u0020 jsou považovány za bílé.
  • (2) Metoda valueOf(), jejímž parametrem je reference na objekt, používá pro převod metodu toString() (viz 11.5.).
  • (3) Třídy Byte a Short jsou k dispozici od JDK 1.1.

Predchozi
Converted by Selathco v0.9 on 25.09.1999 19:46
Dalsi