Programování v jazyku Java (6) - Řetězce I

V tomto díle si ukážeme jak jsou v Javě ukládány a zpracovávány textové informace.

20.8.2004 14:00 | Petr Hatina | přečteno 82489×

Řetězce I

Řětězce slouží k ukládání textových informací. V Javě jsou vnitřně kódovány v UNICODE. Používají dvě základní objektové třídy - String a StringBuffer.

Třída String slouží k ukládání konstantních textových informací, které nehodláme (nebo jen málo) měnit. Hodnota v objektu typu String totiž je konstantní, při změně nebo přiřazení jiné hodnoty je vytvořen v paměti nový objekt a přiřazen původní proměnné. Původní hodnota objektu je posléze v paměti smazána. Což spotřebuje určitou časovou i systémovou režii.

Proto je pro ukládání textových informací, které jsou v programu častěji modifikovány, rozšiřovány či spojovány lépe použít třídu StringBuffer, které se budeme věnovat příště.

String

Proměnnou typu String lze obvykle inicializovat přiřazením textové konstanty:

String s= "Helo World";

Kromě přímého přiřazení pevné textové hodnoty můžeme řetězec inicializovat již při jeho deklaraci i jinak:

String s=  new String() ;    // prázdný řetězec
String s=  new String(String t); //rovnou překopíruje jiný řetězec
String s=  new String(char ch[] );  // řetězec  z pole znaků
String s=  new StringBuffer();    // řetězec z objektu StringBuffer 
String s = new String(byte[] pole,"ISO8859_2") /*vytvoří a převede 
 řetězec z pole znaků v jiné znakové sadě" */

Řetězce můžeme spojovat (s výhradou vůči optimalizaci, viz výše ) operátorem +

String Jmeno="Jan";String Prijmeni="Novak";
String Vizitka= Jmeno+ " "+ Prijmeni;
System.out.println("Jeho inicialy jsou " + Jmeno+ " "+ Prijmeni);

Aktuální délku řetězce vrací metoda length :

int delka=Jmeno.length();

Co provádět nemůžeme, to je porovnání řetězců operátorem ==,protože typ String je odkaz. Musíme použít jeho metodu equals (resp. equalsIgnoreCase) , která ignoruje rozdíly mezi velkými a malými písmeny).

String s1="Jan";boolean ok;
ok=s1.equals("Jan"); //vraci true
ok=s1.equals("jan"); //vraci false 
ok=s1.equalsIgnoreCase("jan"); //takhle je to OK
ok=s1.equals("franta"); //vraci false

Potřebujeme-li při porovnání určit který z řetězců je větší, použijeme metodu compareTo

String s1="Jan";
int i=s1.compareTo("franta"); // vrací záporné číslo

Metoda compareTo vrací 0 pokud jsou oba řetězce stejné,záporné číslo pokud je porovnávaný řetězec menší než předaný poarametr a kladné číslo pokud je větší.

Pro porovnání zda text obsahuje pouze určité skupiny znaků slouží metoda matches, která porovnává řetězec podle regulárních výrazů, tak jak je známe z linuxových příkazů. S regulárním výrazy pracují i metody replaceAll, replaceFirst(), které nahrazují část řetězce jiným textem. Regulárním výrazům v řetězcích budeme věnovat samostatnou kapitolu.

Jednotlivé znaky v řetězci lze měnit pomocí metody replace:

String s="01234567890";
s=s.replace('0','X');   //změní všechny  znaky 0 na X

K metodám, měnícím obsah řetězce patří také toUpperCase a toLowerCase, (převod na velká, resp. malá písmena), a trim, která odstraňuje úvodní a koncové bílé znaky (tj.mezery, tabelátor, konec řádku).

Vyhledávat text v řetězci lze pomocí metody indexOf, která vrací polohu podřetězce v řětězci, (tedy přesně řečeno, vrací index, takže se počítá od 0) či startsWith, která testuje zda řetězec začíná uvedeným textem.

Opačnou funkci, tedy vrácení řetězce na určité pozici obstarávají metody substring a charAt(ta vrací znak na pozici).

String s="01234567890"
int poz= s.indexOf("456") //vyhledá pozici podřetězce v celém řetězci
boolean ok=s.startsWith("0123") //
String sub= s.substring(0,2); //vrací podřetězec od indexu 0 do 2-1

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=341