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ť:
{JAVA_CONSOLE}
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"));
{/JAVA_CONSOLE}
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:
{JAVA_CONSOLE}
String space = " ";
String emptyString = "";
String myString = "word";
System.out.println(space.isEmpty());
System.out.println(emptyString.isEmpty());
System.out.println(myString.isEmpty());
{/JAVA_CONSOLE}
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:
{JAVA_CONSOLE}
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"));
{/JAVA_CONSOLE}
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:
{JAVA_CONSOLE}
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);
{/JAVA_CONSOLE}
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:
{JAVA_CONSOLE}
String sentence = "C# is the best!";
sentence = sentence.replace("C#", "Java");
System.out.println(sentence);
{/JAVA_CONSOLE}
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
:
{JAVA_CONSOLE}
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);
{/JAVA_CONSOLE}
Výstup programu:
Konzolová aplikácia
When we add up 10 and 20, we get 30
Značky sú:
%d
pre celé čísla,%s
preString
,%f
prefloat
alebodouble
(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ť:
{JAVA_CONSOLE}
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);
{/JAVA_CONSOLE}
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:
{JAVA_CONSOLE}
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());
{/JAVA_CONSOLE}
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í.