7. diel - Poľa v Kotlin
V minulej lekcii kurzu, Typový systém: Null safety v Kotlin , sme sa naučili používať nullovatelné typy. Dnes si v Kotlin tutoriálu predstavíme dátovú štruktúru poľa a vyskúšame si, čo všetko vie.
Poľa
Predstavme si, že chceme uložiť nejaké údaje o viac prvkoch. Napr.
chceme v pamäti uchovávať 10 čísel, políčka šachovnice alebo mena 50
užívateľov. Asi vám dôjde, že v programovaní bude nejaká lepšia cesta,
než začať búšiť premenné uzivatel1, uzivatel2,
... až uzivatel50. Nehľadiac na to, že ich môže byť potrebné
1000. A ako by sa v tom potom hľadalo? Brrr, takto nie 
Ak potrebujeme uchovávať väčšie množstvo premenných rovnakého
typu, tento problém nám rieši poľa. Môžeme si ho predstaviť ako
rad priehradiek, kde v každej máme uložený jeden prvok. Priehradky sú
očíslované tzv. Indexy, prvý má index 0.

(Na obrázku je vidieť pole ôsmich čísiel)
Programovacie jazyky sa veľmi líšia v tom, ako s poľom pracujú. V niektorých jazykoch (najmä starších, kompilovaných) nebolo možné za behu programu vytvoriť pole s dynamickou veľkosťou (napr. Mu dať veľkosť podľa nejaké premenné). Pole sa muselo deklarovať s konštantnou veľkosťou priamo v zdrojovom kóde. Toto sa obchádzalo tzv. Pointer a vlastnými dátovými štruktúrami, čo často viedlo k chybám pri manuálnej správe pamäte a nestabilite programu (napr. V C ++). Naopak niektoré interpretované jazyky umožňujú nielen deklarovať pole s ľubovoľnou veľkosťou, ale dokonca túto veľkosť na už existujúcom poli meniť (napr. PHP). Kotlín sa radí k tým moderným, nemusíte sa starať o veľkosť polí (dokonca ju ani nemôžete pevne zadať) a pridávať prvky môžete aj do už vytvoreného poľa.
Pole deklarujeme pomocou funkcie arrayOf():
var pole = arrayOf<Int>()
Výraz pole je samozrejme názov našej premennej. Teraz sme
vytvorili prázdne pole čísel typu Int.
Nové prvky do poľa najskôr pridáme operátorom +=. V našom
prípade za neho uvedieme pridávané číslo ako Int, ktorý sa
uloží na koniec poľa:
var pole = arrayOf<Int>() pole += 34
Do poľa môžeme takto pridať aj ďalšie pole rovnakého typu (teda typu
Int v našom prípade), ktorého prvky sa do poľa pridajú.
K prvkom poľa pristupujeme cez hranatú zátvorku, kam uvedieme index prvku. Môžeme to urobiť samozrejme len vtedy, keď prvok na danom indexe existuje. Skúsme si to:
{KOTLIN_CONSOLE}
var pole = arrayOf<Int>()
pole += 34
print(pole[0])
{/KOTLIN_CONSOLE}
Vypísali sme prvok na indexe 0, teda prvý, pretože sú indexy
od nuly. Na výstupe naozaj vidíme číslo 34, ktoré je tam
uložené:
34
Plniť poľa takto ručne by bolo príliš pracné, použijeme cyklus a
naplníme si pole číslami od 1 do 10. K naplneniu
použijeme for cyklus:
var pole = arrayOf<Int>() for (i in 1..10) { pole += i }
Aby sme celé pole vypísali, môžeme za predchádzajúci kód pripísať:
{KOTLIN_CONSOLE}
var pole = arrayOf<Int>()
for (i in 1..10) {
pole += i
}
for (i in pole) {
print("$i ")
}
{/KOTLIN_CONSOLE}
Teraz už je lepšie vidieť sila for cyklu v Kotlin. Stačí za
in miesto definované rady čísel vložiť polia a cyklus prejde
všetky prvky. V tele cykle k nim potom môžeme pristupovať a napr. Je
vypísať:
1 2 3 4 5 6 7 8 9 10
Pole má vlastnosť size, kde je uložený počet jeho
prvkov.
Pole samozrejme môžeme naplniť ručne a to aj bez toho, aby sme
dosadzovali postupne do každého indexu. Použijeme na to funkciu
arrayOf() a do zátvoriek napíšeme prvky, ktoré oddeľujeme
čiarkou. Tentoraz si skúsime vytvoriť pole textových reťazcov:
val simpsonovi = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
Pretože teraz nechceme, aby nám niekto obsah poľa menil, deklarujeme ho
pomocou val a tým sa pole stáva konštantná. Vynechali sme
upresnenie typu, Kotlin z prvkov totiž ľahko spozná, že ide o pole reťazcov
(String). Samozrejme nám ale nič nebráni typ uviesť:
val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
Pole často slúži na ukladanie medzivýsledkov, ktoré sa potom ďalej v programe používajú. Keď potrebujeme nejaký výsledok 10x, tak ho nebudeme 10x počítať, ale spočítame ho raz a uložíme do poľa, odtiaľ potom daný výsledok len načítame.
Metódy pole
Na poliach nám Kotlin poskytuje pomocné metódy pre prácu s nimi. Poďme sa na ne pozrieť:
sort() a sorted()
Ako už názov napovedá, metódy nám poľa zoradí. Metóda
sort() zoradia už existujúce pole (takže musí byť deklarované
pomocou var) a sorted() nám vráti nové zotriedené
poľa, takže ho nesmiete zabudnúť priradiť do premennej. Metódy sú dokonca
tak šikovné, že pracujú podľa toho, čo máme v poli uložené. Reťazce
triedi podľa abecedy, čísla podľa veľkosti. Skúsme si zotrieďiť a
vypísať našu rodinku Simpson:
{KOTLIN_CONSOLE}
val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
simpsonovi.sort()
for (simpson in simpsonovi) {
println(simpson)
}
{/KOTLIN_CONSOLE}
výsledok:
Bart Homer Lisa Marge Meggie
A spôsob zoradenie pomocou metódy sorted():
{KOTLIN_CONSOLE}
val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
val simpsonovi_sorted = simpsonovi.sortedArray()
for (simpson in simpsonovi_sorted) {
println(simpson)
}
{/KOTLIN_CONSOLE}
Bart Homer Lisa Marge Meggie
Skúste si vytvoriť pole čísel a vyskúšajte si, že to naozaj funguje aj pre nich.
reverse() a
reversedArray()
Tieto metódy nám poľa otočia (prvý prvok bude ako posledná atp.).
Princíp je opäť rovnaký ako u triedenie. Metóda reverse()
otočí existujúce pole, reversedArray() nám potom otočené pole
vráti. Toho môžeme využiť napr. Pre triedenie pospiatky:
{KOTLIN_CONSOLE}
val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
simpsonovi.sort()
simpsonovi.reverse()
for (simpson in simpsonovi) {
println(simpson)
}
{/KOTLIN_CONSOLE}
výsledok:
Meggie Marge Lisa Homer Bart
indexOf()
Metóda nám nájde prvý výskyt daného prvku v poli a vráti jeho index
ako Int. Môže sa stať, že prvok v poli nie je, v takom prípade
metóda vráti -1. Vytvoríme si jednoduchý program, ktorý bude
predpokladať, že Simpsni sú v poli zoradenie podľa obľúbenosti. Keď
používateľ nejakého zadá, vypíšeme mu koľký je alebo že v poli nie
je.
{KOTLIN_CONSOLE}
val simpsonovi = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
println("Ahoj zadaj svojho obľúbeného Simpsni (z rodiny Simpson): ")
val simpson = readLine()!!
val pozice = simpsonovi.indexOf(simpson)
if (pozice != -1) {
println("Jo, to je môj ${pozice + 1}. najobľúbenejšie Simpson!")
} else {
println("Hele, toto nie je Simpson!")
}
{/KOTLIN_CONSOLE}
výsledok:
Ahoj zadaj svojho obľúbeného Simpsni (z rodiny Simpson): Homer Jo, to je môj 1. najobľúbenejšie Simpson!
size
size sme si už spomenuli, obsahuje počet prvkov v poli. Nie je
metódou, ale vlastností, nepíšu sa za ňu teda zátvorky
().
isEmpty()
Ako asi tušíte, táto metóda vráti true, ak je naša pole
prázdne. Jej použitie je čitateľnejší, než sa pýtať pomocou
pole.size == 0. Z kódu je hneď jasné, že nás zaujíma
možnosť keď je pole prázdne.
min() a max()
Matematické metódy, vracajúci najmenší prvok (min()) a
najväčší prvok (max()) v poli. Výsledok vráti ako
nullovatelný typ, pre prípad, že by pole bolo prázdne.
first() a last()
Už podľa názvu vlastnosti vráti prvý a posledný prvok. Návratové hodnoty sú opäť nullable.
contains()
Metóda vracia true / false podľa toho, či sa
prvok uvedený v parametri metódy v danom poli nachádzajú.
To by pre dnešok stačilo, môžete si s poľom hrať. V budúcej lekcii,
Riešené úlohy k 7. lekcii Kotlin , na vás čaká prekvapenie 
V nasledujúcom cvičení, Riešené úlohy k 7. lekcii Kotlin, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 622x (16.5 kB)
