IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

6. diel - Textové reťazce a referenčné typy v Jave

V minulej lekcii, Primitívne dátové typy v Jave, sme si podrobne prebrali dátové typy.

V dnešnom Java tutoriále sa pozrieme na referenčné dátové typy. Popíšeme si vybrané metódy dátového typu String a v priebehu tutoriálu sa s nimi naučíme pracovať.

Referenčné dátové typy

K referenčným typom sa dostaneme až pri objektovo orientovanom programovaní, kde si tiež vysvetlíme zásadné rozdiely. Zatiaľ budeme pracovať len s tak jednoduchými typmi, že rozdiel nespoznáme. Uspokojíme sa s tým, že referenčné typy sú zložitejšie než tie primitívne. Jeden takýto typ už poznáme, je ním String. Možno vám napadá, že String nemá nijako obmedzenú dĺžku. Je to tým, že s referenčnými typmi sa v pamäti pracuje inak. Referenčné typy začínajú na rozdiel od typov primitívnych veľkým písmenom.

Dátový typ String

Dátový typ String má na sebe množstvo naozaj užitočných metód. Niektoré si teraz preberieme a vyskúšame.

Metódy startsWith(), endsWith() a contains()

Môžeme sa jednoducho opýtať, či reťazec začína, končí alebo či obsahuje určitý podreťazec (substring). Podreťazcom myslíme časť pôvodného reťazca. Všetky tieto metódy budú ako parameter brať samozrejme podreťazec a budú vracať hodnoty typu boolean (true / false). Zatiaľ na výstup nevieme reagovať, ale poďme si ho aspoň vypísať:

String input = "Rhinopotamus";
System.out.println(input.startsWith("rhin"));
System.out.println(input.endsWith("tamus"));
System.out.println(input.contains("pot"));
System.out.println(input.contains("lol"));

Výstup programu:

Konzolová aplikácia
false
true
true
false

Vidíme, že všetko funguje podľa očakávania. Prvý výraz samozrejme neprešiel vďaka tomu, že reťazec v skutočnosti začína veľkým písmenom.

Metóda isEmpty()

Niekedy sa nám hodí vedieť, či je reťazec prázdny. To znamená, že jeho dĺžka je 0 a neobsahuje žiadny znak a ani napr. medzeru. Takýto reťazec môžeme získať napr. tak, že používateľ nezadá nič do nejakého vstupu. Metóda isEmpty() nám vráti true, ak je reťazec prázdny, a false, ak nie je:

String space = " ";
String emptyString = "";
String myString = "word";
System.out.println(space.isEmpty());
System.out.println(emptyString.isEmpty());
System.out.println(myString.isEmpty());

Výstup programu:

Konzolová aplikácia
false
true
false

Metódy toUpperCase() a toLowerCase()

Rozlišovanie veľkých a malých písmen môže byť niekedy na obtiaž. Veľakrát sa budeme potrebovať opýtať na prítomnosť podreťazca tak, aby nezáležalo na veľkosti písmen. Situáciu môžeme vyriešiť pomocou metód toUpperCase() a toLowerCase(), ktoré vracajú reťazec vo veľkých a v malých písmenách. Uveďme si reálnejší príklad ako je Rhinopotamus. Budeme mať v premennej riadok konfiguračného súboru, ktorý písal používateľ. Keďže sa na vstupy od užívateľov nemožno spoľahnúť, musíme sa snažiť eliminovať možné chyby, tu napr. s veľkými písmenami:

String config = "Fullscreen shaDows autosave";
config = config.toLowerCase();
System.out.println("Will the game run in fullscreen?");
System.out.println(config.contains("fullscreen"));
System.out.println("Will shadows be turned on?");
System.out.println(config.contains("shadows"));
System.out.println("Will sound be turned off?");
System.out.println(config.contains("nosound"));
System.out.println("Would the player like to use autosave?");
System.out.println(config.contains("autosave"));

Výstup programu:

Konzolová aplikácia
Will the game run in fullscreen?
true
Will shadows be turned on?
true
Will sound be turned off?
false
Would the player like to use autosave?
true

Vidíme, že sme schopní zistiť prítomnosť jednotlivých slov v reťazci tak, že si najskôr celý reťazec prevedieme na malé písmená (alebo na veľké) a potom skontrolujeme prítomnosť slova len malými (alebo veľkými) písmenami. Takto by mimochodom mohlo skutočne vyzerať jednoduché spracovanie nejakého konfiguračného skriptu.

Metóda trim()

Ďalšou nástrahou môžu byť medzery a všeobecne všetky tzv. biele znaky, ktoré nie sú vidieť, ale môžu nám uškodiť. Všeobecne môže byť dobré trimovať všetky vstupy od používateľa. Skúste si v nasledujúcej aplikácii pred číslo a za číslo zadať niekoľko medzier, trim() ich odstráni. Odstraňujú sa vždy biele znaky okolo reťazca, nie vo vnútri:

Scanner scanner = new Scanner(System.in, "Windows-1250");
System.out.println("Enter a number:");
String input = scanner.nextLine();
System.out.println("Here's what you originally wrote: " + input);
System.out.println("Your text after the trim function: " + input.trim());
int number = Integer.parseInt(input.trim());
System.out.println("I converted the text you entered to a number. Here it is: " + number);

Metóda replace()

Asi najdôležitejšou metódou pre typ String je nahradenie určitej jeho časti iným textom. Ako parametre zadáme dva podreťazce. Jeden, čo chceme nahrádzať, a druhý ten, ktorým to chceme nahradiť. Metóda vráti nový String, v ktorom prebehlo nahradenie. Keď daný podreťazec metóda nenájde, vráti pôvodný reťazec. Skúsme si to:

String sentence = "C# is the best!";
sentence = sentence.replace("C#", "Java");
System.out.println(sentence);

Výstup programu:

Konzolová aplikácia
Java is the best!

Metóda format()

Metóda format() je veľmi užitočná metóda, ktorá nám umožňuje vkladať do samotného textového reťazca zástupné značky. Tie sú reprezentované ako percento a skratka dátového typu. Metóda sa volá na type String, prvým parametrom je textový reťazec so značkami, ďalej nasledujú premenné v tom poradí, v ktorom sa majú do textu namiesto značiek vložiť. Všimnite si, že metóda nevolá na konkrétne premenné (presnejšie inštanciu, viď ďalšie diely), ale priamo na typ String:

int a = 10;
int b = 20;
int sum = a + b;
String sentence = String.format("When we add up %d and %d, we get %d", a, b, sum);
System.out.println(sentence);

Výstup programu:

Konzolová aplikácia
When we add up 10 and 20, we get 30

Značky sú:

  • %d pre celé čísla,
  • %s pre String,
  • %f pre float alebo double (reálne čísla). Môžeme taktiež definovať dĺžku desatinnej časti, napr. %.2f pre dve desatinné miesta.

Konzola vie sama prijímať text v takomto formáte, len musíme namiesto metódy println() volať printf(). Môžeme teda napísať:

int a = 10;
int b = 20;
int sum = a + b;
System.out.printf("When we add up %d and %d, we get %d", a, b, sum);

Toto je veľmi užitočná a prehľadná cesta ako zostavovať reťazce, aj napriek tomu sa však v Jave reťazce spájajú skôr pomocou operátora +.

Metóda printf() berie do úvahy lokalizáciu systému a môže namiesto desatinnej bodky vypísať desatinnú čiarku. Dajte si teda pozor, že očakávaný výstup desatinných čísel na rôznych platformách (jazykoch) nemusí byť úplne totožný.

Metóda length()

Posledná, ale najdôležitejšia, je metóda length(), teda dĺžka. Vracia celé číslo, ktoré predstavuje počet znakov v reťazci:

Scanner scanner = new Scanner(System.in, "Windows-1250");
System.out.println("Type in your name:");
String name = scanner.nextLine();
System.out.printf("Your name is %d characters long", name.length());

Je toho ešte veľa na vysvetľovanie a sú ďalšie dátové typy, ktoré sme neprebrali. K reťazcom sa ešte vrátime neskôr v kurze 😉

V nasledujúcom cvičení, Riešené úlohy k 5.-6. lekcii Javy, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Predchádzajúci článok
Primitívne dátové typy v Jave
Všetky články v sekcii
Základné konštrukcie jazyka Java
Preskočiť článok
(neodporúčame)
Riešené úlohy k 5.-6. lekcii Javy
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
43 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity