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é 518x (16.5 kB)