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

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.

Štruktúra poľa v Kotlin - Základné konštrukcie jazyka Kotlin

(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:

var pole = arrayOf<Int>()
pole += 34
print(pole[0])

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ť:

for (i in pole) {
    print("$i ")
}

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:

val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
simpsonovi.sort()
for (simpson in simpsonovi) {
    println(simpson)
}

výsledok:

Bart
Homer
Lisa
Marge
Meggie

A spôsob zoradenie pomocou metódy sorted():

val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")

val simpsonovi_sorted = simpsonovi.sortedArray()
for (simpson in simpsonovi_sorted) {
    println(simpson)
}
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:

val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
simpsonovi.sort()
simpsonovi.reverse()
for (simpson in simpsonovi) {
    println(simpson)
}

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.

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!")
}

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 podmienkami

Stiahnuté 508x (16.5 kB)

 

Predchádzajúci článok
Typový systém: Null safety v Kotlin
Všetky články v sekcii
Základné konštrukcie jazyka Kotlin
Preskočiť článok
(neodporúčame)
Riešené úlohy k 7. lekcii Kotlin
Článok pre vás napísal Samuel Kodytek
Avatar
Užívateľské hodnotenie:
3 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