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

9. diel - Textové reťazce v Kotlin do tretice - Split

V predchádzajúcom cvičení, Riešené úlohy k 8. lekcii Kotlin, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

Dnes si v Kotlin tutoriálu vysvetlíme ďalšie metódy na reťazci, ktoré som vám zámerne zatajil, pretože sme nevedeli, že String je vlastne pole:)

Na reťazci môžeme používať mnoho metód alebo vlastností, ktoré poznáme z poľa. Sú to napr: first(), last(), indexOf() a ďalšie.

Keď si vytvoríme ľubovoľnú premennú a napíšeme za ňu bodku, IntelliJ IDEA nám zobrazí ponuku všetkých metód a vlastností (a tiež premenných, ale k tomu sa dostaneme až pri objektoch), ktoré na ňu môžeme volať. Skúsme si to:

Kotlín autocomplete v IntelliJ IDEA - Základné konštrukcie jazyka Kotlin

Tú istú ponuku možno vyvolať aj stlačením Ctrl + Medzerník v prípade, že textový kurzor umiestnime na bodku. Samozrejme to platí pre všetky premenné aj triedy a budeme toho využívať čoraz častejšie. Metódy sú radené abecedne a môžeme nimi listovať pomocou kurzorových šípok. IntelliJ nám zobrazuje opis metód (čo robia) a aké vyžadujú parametre.

Povedzme si o nasledujúcich metódach a ukážme si ich na jednoduchých príkladoch:

Ďalšie metódy na reťazci

substring()

Vráti podreťazec od danej počiatočnej pozície do danej koncovej pozície.

println("Wolfgang Amadeus Mozart".substring(9, 16))

výstup:

Amadeus

compareTo()

Umožňuje porovnať dva reťazce podľa abecedy. Vracia -1 ak je prvý reťazec pred reťazcom v parametri, 0 ak sú rovnaké a 1 ak je za ním:

println("argentina".compareTo("barbados"))

výstup:

-1

Poďme sa teraz pozrieť na ďalšiu metódu na String, ktorá je naozaj veľmi užitočná.

split() a joinToString()

Z predchádzajúceho tutoriálu vieme, že parsování reťazca znak po znaku môže byť niekedy celkom zložité a to sme robili pomerne jednoduchý príklad. S reťazci sa samozrejme budeme stretávať stále, a to ako na vstupe od užívateľa (napr. Z konzoly alebo z polí v okenných aplikáciách), tak v súboroch TXT a XML. Veľmi často máme zadaný jeden dlhší String (riadok súboru alebo riadok konzoly), v ktorom je viac hodnôt, oddelených tzv. Separátory, napr. Čiarkou. V tomto prípade hovoríme o formáte CSV (Comma-Separated Values, teda hodnoty oddelené čiarkou). Aby sme si boli istí, že vieme, o čom hovoríme, ukážme si nejaké ukážkové reťazca:

Jan,Novák,Dlhá 10,Praha 3,130 00
.. ... .-.. .- -. -.. ... --- ..-. -
(1,2,3;4,5,6;7,8,9)
  • Prvý reťazec je očividne nejaký užívateľ, takto by sme mohli napr. Realizovať uloženie užívateľov do CSV súboru, každý na jeden riadok.
  • Druhý reťazec sú znaky Morseovej abecedy, separátor (oddeľovač) je tu medzera.
  • Tretí reťazec je matica o 3 stĺpcoch a 3 riadkoch. Oddeľovač stĺpcov je čiarka, riadkov bodkočiarka.

Na String môžeme volať metódu split(), ktorá berie ako parameter separátor (typu Char). Následne pôvodnej reťazec rozdelí podľa separátora na pole podreťazcov, ktoré vráti. To nám veľmi uľahčí prácu pri rozdeľovaní hodnôt v reťazci.

Metóda joinToString() nám naopak umožňuje pole podreťazcov spojiť oddeľovačom do jediného reťazca, parameter je oddeľovač. Výstupom metódy je výsledný reťazec. Metódu môžeme zavolať bez parametra a tým dôjde k spojeniu reťazcov bez oddeľovača.

Keďže nevieme tvoriť objekty (používateľa) a ani pracovať s viacrozmernými poliami (matice), skúsime si naprogramovať dekodér správ z Morseovej abecedy.

Dekodér Morseovej abecedy

Poďme si opäť pripraviť štruktúru programu. Budeme potrebovať 2 reťazca so správou, jeden so správou v Morseovej abecede, druhý zatiaľ prázdny, do ktorého budeme ukladať výsledok nášho snaženia. Ďalej budeme ako v prípade samohlások potrebovať nejaký vzor písmen. K písmenám samozrejme vzor ich znaku v morzeovce. Písmená môžeme opäť uložiť do púhe premennej typu String, pretože majú len jeden znak. Znaky Morseovej abecedy majú už znakov viac, tie musíme dať do poľa.

Štruktúra nášho programu by teraz mohla vyzerať nasledovne:

// reťazec, ktorý chceme dekódovať
val s = ".-.. . --- -. .- .-. -.. ---"
println("Pôvodná správa: $s")
// reťazec s Dekódovanie správou
var zprava = ""

// vzorová pole
val abecedniZnaky = "abcdefghijklmnopqrstuvwxyz"
val morseovyZnaky = arrayOf(".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..")

Môžete si potom pridať ďalšie znaky ako čísla a interpunkčné znamienka, my ich tu vynecháme. Teraz si reťazec s rozbijeme metódou split() na pole podreťazcov, obsahujúcich jednotlivé znaky morzeovky. Splitová budeme podľa znaku medzery. Pole následne proiterujeme cyklom for:

// rozbitie reťazca na znaky morzeovky
val znaky = s.split(" ")

// iterácie znakov morzeovky
for (morseuvZnak in znaky) {

}

Ideálne by sme sa mali nejako vysporiadať s prípadmi, kde užívateľ zadá napr. Viac medzier medzi znakmi (to užívatelia radi robia). split() potom vytvorí o jeden reťazec v poli viac, ktorý bude prázdny. Ten by sme mali potom v cykle detekovať a ignorovať, my sa s tým v Kotlin tutoriálu nebudeme zaoberať.

V cykle sa pokúsime nájsť aktuálne čítaný znak morzeovky v poli morseovyZnaky. Bude nás zaujímať jeho index, pretože keď sa pozrieme na ten istý index v reťazci abecedniZnaky, bude tam zodpovedajúce písmeno. To je samozrejme z toho dôvodu, že ako pole tak reťazec obsahujú rovnaké znaky, zoradené podľa abecedy. Umiestni do tela cyklu nasledujúci kód:

val index = morseovyZnaky.indexOf(morseuvZnak)

// Skontrolovanie, že sme index našli
if (index != -1) {
    zprava += abecedniZnaky[index]
}

Pokúsime sa zistiť index Morseova znaku. Ak sa to podarí, nájdeme v abecede zodpovedajúce písmeno a to pridáme do správy. Operátor += nahrádza zprava = zprava + abecedniZnaky[index].

Záverom samozrejme správu vypíšeme:

println("Dekódovaná správa: $zprava")

výstup:

Pôvodná správa: .-.. . --- -. .- .-. -.. ---
Dekódovaná správa: leonardo

Hotovo! Za úlohu máte si naprogramovať program opačný, ktorý naopak zakóduje reťazec do morzeovky, kód bude veľmi podobný. Sa split() a joinToString() sa stretneme počas Kotlin kurzu ešte niekoľkokrát.

Špeciálne znaky alebo uvádzacích

Textový reťazec môže obsahovať špeciálne znaky, ktoré sú predsadené spätným lomítkom \. Je to najmä znak \n, ktorý kdekoľvek v texte spôsobí odriadkovanie a potom \t, kde sa jedná o tabulátor.

Poďme si to vyskúšať:

println("Prvý riadok\nDruhý riadok")

Znak \ označuje nejakú špeciálnu sekvenciu znakov v reťazci a je ďalej využívaný napr. K písanie unicode znaku ako \u{xxxx}, kde xxxx je kód znaku.

Problém môže nastať vo chvíli, keď chceme napísať samotné \, musíme ho tzv. Odescapovat:

println("Toto je spätné lomítko: \\")

Rovnakým spôsobom môžeme odescapovat napr. Úvodzovky tak, aby ju Kotlin nechápal ako koniec reťazca:

println("Toto je úvodzovky: \"")

Vstupy z konzoly a polí v okenných aplikáciách sa samozrejme escapují samy, aby užívateľ nemohol zadať \n a podobne. V kóde to má programátor povolené a musia na to myslieť.

Raw string

Občas potrebujeme zapísať viac spätných lomítok v jednom textovom reťazci. Keby sme ich všetky escapovali, mohlo by to znepřehlednit náš kód. Kvôli tomuto problému možno v Kotlin deklarovať tzv. Raw string. Stačí obaliť text do """ a všetka spätné lomítka sa správajú ako obyčajné znaky.

println("""V tomto stringu nemusím nič escapovat \""")

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


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 43x (7.71 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Kotlin

 

Predchádzajúci článok
Riešené úlohy k 8. lekcii Kotlin
Všetky články v sekcii
Základné konštrukcie jazyka Kotlin
Preskočiť článok
(neodporúčame)
Riešené úlohy k 9. lekcii Kotlin
Článok pre vás napísal Samuel Kodytek
Avatar
Užívateľské hodnotenie:
2 hlasov
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Aktivity