Programování v jazyku Java (7) - Řetězce II

V této části si povíme o třídě StringBuffer, sloužící k ukládání často měněných řetězců, a následně ještě o konverzích mezi řetězci a dalšími typy.

27.8.2004 12:00 | Petr Hatina | přečteno 55974×

Řetězce II

StringBuffer

Jak již bylo uvedeno, třída StringBuffer se používá pro ukládání textových řetězců, které budou častěji modifikovány. Pro jejich deklaraci lze použít jeden z těch to způsobů:

StringBuffer strbuf1= new StringBuffer(); //prázdný
StringBuffer strbuf2= new StringBuffer("Text");//z prom.typu String 
StringBuffer strbuf3= new StringBuffer(80);//s kapacitou 80 znaků

Rozšíření řetězce pak provést metodami:

StringBuffer strbuf= new StringBuffer("text");
strbuf.append("text2"); // rozšíří řetězec
strbuf.insert(1,"ret"); //vloží text za 2.znak (počítá se od 0)

Metody append a insert nemusí vkládat pouze řetězec, ale i další primitivní typy (např. čísla) nebo pole znaků.

Modifikace obsahu řetězce lze provádět pomocí metod replace(od, do-1 , novýtext) či setCharAt (jen jeden znak).

StringBuffer strbuf= new StringBuffer("stary text");
strbuf.replace(0,5,"novy"); // změní "stary" na "novy"
// nutno přičíst k pozici do  +1
strbuf.setCharAt(0,'X');  //přepíše znak na  pozici 0 Xkem

Obsah řetězce lze i rušit pomocí metod delete(od,do-1), a deleteCharAt(index)), ta zruší jen znak na určené pozici indexu.

StringBuffer strbuf= new StringBuffer("textbezKonec");
strbuf.delete(4,7);//smaž text bez(od poz. 4 do 6+1)
strbuf.deleteCharAt(0);

Podobně jako u třídy String lze hledat v řetězci pozici určitého podřetězce metodou indexOf a opačně načíst obsah řetězce od určité pozice metodami substring a charAt.

Při popisu inicializace byla zmíněna kapacita. Její princip spočívá v tom, že pro uložení znaků v paměti má proměnná typu StringBuffer přiděleny určitý prostor (buffer), když ho překoná, požádá o přidělení dalšího. Aby toto přidělování bylo efektivní,lze předem určit, jaký prostor bude vyžadován, popřípadě ho v programu regulovat těmito metodami:

StringBuffer strbuf1 = new StringBuffer();        
int i= strbuf1.capacity(); //aktuální kapacitu
strbuf1.ensureCapacity(99);//zajisti kapacitu 99 znaků
strbuf1.trimToSize(); //zmenši buffer 
//aby pokryl jen prostor již obsazený znaky



Samotnou délku řetězce pak můžeme zjistit metodou length() , a změnit jí pomocí setLength(délka). V případě zvětšení je doplněna znaky null ('\u0000').

Verze 1.5 Javy doplňuje novu třídu StringBuilder , která která je obdobná třídě StringBuffer. Rozdíl je v tom, že původní třída StringBuffer zajišťuje bezpečnou a správnou funkci i při současném běhu více podprocesů v úloze. To nová třída StringBuilder neumožňuje, odměnou je pak uváděna vyšší rychlost zpracování ve většině implementací.

Vstupy a výstupy

Již v první lekci jsme si ukázali způsob jak provést výstup obsahu proměnné na obrazovku pomocí metody objektu System.out.println.

Opačný směr, tedy načtení obsahu proměnné z klávesnice lze provést pomocí tříd BufferedReader a InputStreamReader:

String vstup;
BufferedReader in;
in = new BufferedReader(new  InputStreamReader(System.in));
try{
  vstup = in.readLine(); }
catch(IOException e) {vstup="";}

Jak je z příkladu vidět, byl vytvořen datový tok s vyrovnávací pamětí, přečte řádek ze standardního vstupu. Příkazy catch a try zajištují, v tomto případě povinné ošetření možného vzniku chybového stavu - vyjímky.

Převody mezi řetězci a čísly

I proto, že v minulém odstavci uvedená metoda readLine načítá a vrací pouze textové řetězce, potřebujeme prostředky pro mezi řetězcem a čísly. Celé číselné typy (byte,int,short,long) mají vestavěnou metodu parseXXX. příslušného typu:

String s="777";
int i=Integer.parseInt(s);

Všechny číselné typy pak obsahují metodu valueOf, která provádí to samé.

String s="1.5";
float f=Float.valueOf(s);

Zpětný převod z čísla na text lze nejlépe provést pomocí metody toString (která se volá při použití operátoru + imlicitně), nebo metodu valueOf().

for (int i=0;i<5;i++)
   System.out.println("tohle je "+ (i+1) + ".");

Metoda toString

Když již byla zmíněna metoda toString pro převod čísel na řetězec, je třeba dodat, že metodu toString obsahuje většina tříd v knihovnách Javy a vrací textovou informaci o obsahu objektu. Můžeme jí volat přímo :

System.out.println((new Date().toString()));

Nicméně pokud program zjistí že v prováděné operaci je požadován místo předávaného objektu typ String, použije tuto metodu automaticky. Což se použije například při přiřazení do řetězce, nebo přímo výstupu v objektu out :

Date dat=new Date();
String Pozdrav= "Ahoj, právě je " + dat;//připojení k řetězci
System.out.println(dat); // je očekáván řetězec
Online verze článku: http://www.linuxsoft.cz/article.php?id_article=353