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

10. diel - Viacrozmerné polia v Kotlin

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

V minulej lekcii, Riešené úlohy k 9. lekcii Kotlin , sme si uviedli metódy split() a joinToString() na textových reťazcoch. Dnešná lekcia je v kurze základných konštrukcií Kotlin v podstate bonusová a pojednáva o tzv. Viacrozmerných poliach.

Už vieme pracovať s jednorozmernými poľom, ktoré si môžeme predstaviť ako riadku priehradok v pamäti počítača.

Dátový typ poľa v Kotlin - Základné konštrukcie jazyka Kotlin

(Na obrázku je vidieť pole ôsmich čísiel)

Hoci to nie je tak časté, v programovaní sa občas stretávame aj s viacrozmernými poliami a to najmä ak programujeme nejakú simuláciu (napr. Hru).

Dvojrozmerné pole

Dvojrozmerné pole si môžeme v pamäti predstaviť ako tabuľku a mohli by sme takto reprezentovať napr. Rozohranú partiu piškvoriek. Ak by sme sa chceli držať reálnych aplikácií, ktoré budete neskôr v zamestnaní tvoriť, môžeme si predstaviť, že do 2D poľa budeme ukladať informácie o obsadenosť sedadiel v kinosály. Situáciu by sme si mohli graficky znázorniť napr. Nasledovne:

Dvojrozmerné pole v kotlín - Základné konštrukcie jazyka Kotlin

(Na obrázku je vidieť 2d pole reprezentujúci obsadenosť kinosály)

Kinosála by bol v praxi samozrejme väčší, ale ako ukážka nám toto pole postačí. 0 znamená voľno, 1 obsadené. Neskôr by sme mohli doplniť aj 2 - Rezervované a podobne. Pre tieto stavy by bolo správnejšie vytvoriť si vlastný dátový typ, tzv. Výpočet, ale s ním sa stretneme až neskôr, takže si teraz musíme vystačiť iba s číslami.

2D polia inicializujeme v Kotlin nasledujúcim spôsobom:

var kinosal = arrayOf<Array<Int>>()

V skutočnosti sa jedná o pole polí. Takže jednotlivým prvkom tohto poľa je zase ďalšie pole.

Vyššie sme síce dvojrozmerné pole úspešne deklarovali, ale musíme si ho ešte naplniť nulami. Pre vyplnenie poľa použijeme 2 vnorené cykly. Ten vonkajšie prejde riadky, ten vnútorný do každého riadku pridá daný počet núl. Budeme chcieť poľa veľkosti 5 x 5:

for (i in 0..4) {
    var pole = arrayOf<Int>()
    for (j in 0..4) {
        pole += 0
    }
    kinosal += pole
}

Naše 2D poľa si môžeme pre kontrolu vypísať. Prvý cyklus prejde jednotlivé polia a ten vnorený potom ich hodnoty:

for (pole in kinosal) {
    for (hodnota in pole) {
        print("$hodnota ")
    }
    println()
}

výstup:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Naplnenie dátami

Teraz kinosála naplníme jednotkami tak, ako je vidieť na obrázku vyššie. Pretože budeme ako správni programátori leniví, využijeme na vytvorenie riadku jednotiek for cykly :) Pre prístup k prvku 2D poľa musíme samozrejme zadať 2 súradnice. Keby sme pole nemali naplnené nulami (či inými hodnotami), tak tento kód nebude fungovať.

kinosal[2][2] = 1
for (i in 1..3) {
    kinosal[3][i] = 1
}
for (i in 0..4) {
    kinosal[4][i] = 1
}

Pre kontrolu môžeme poľa opäť vypísať:

0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 1 1 1 0
1 1 1 1 1

N-rozmerná pole

Niekedy môže byť príhodné vytvoriť si pole o ešte viac dimenziách. My všetci si iste dokážeme predstaviť minimálne 3D poľa. S príkladom s kinosálou sa ponúka prípad použitia, kedy má budova viac poschodí (alebo všeobecne viac kinosál). Vizualizácia by vyzerala asi nejako takto:

3D poľa v Kotlin - Základné konštrukcie jazyka Kotlin

3D poľa môžeme vytvoriť tým istým spôsobom, ako 2D pole:

var kinosaly = arrayOf<Array<Array<Int>>>()

Vyplnili by sme ho zase rovnako ako pred tým:

for (i in 0..2) {
    var kinosal = arrayOf<Array<Int>>()
    for (j in 0..4) {
        var pole = arrayOf<Int>()
        for (k in 0..4) {
            pole += 0
        }
        kinosal += pole
    }
    kinosaly += kinosal
}

Princíp je stále rovnaký, akurát je ťažšie sa v ňom orientovať :-)

Kód vyššie vytvorí 3D poľa ako na obrázku. Pristupovať k nemu budeme opäť cez Indexer (hranaté zátvorky) ako predtým, len už musíme zadať 3 súradnice.

kinosaly[1][2][3] = 1 // Druhý kinosála, tretí rad, štvrtý stĺpec

Naše kino by sme si mohli vypísať napríklad takto:

var patro = 1

for (kinosal in kinosaly) {
    println("Poschodie: $patro")
    patro += 1
    for (pole in kinosal) {
        for (hodnota in pole) {
            print("$hodnota ")
        }
        println()
    }
    println("-----------------")
}

Výstup po priradení 1 v kóde vyššie:

Poschodie: 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
-----------------
Poschodie: 2
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 0 0 0
0 0 0 0 0
-----------------
Poschodie: 3
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
-----------------

Na záver by som rád dodal, že niektorí ľudia, ktorí nevie správne používať objekty, využívajú 2D polí na ukladanie viac údajov o jedinej entite. Napr. budeme chcieť uložiť výšku, šírku a dĺžku piatich mobilných telefónov. Hoci sa vám teraz môže zdať, že sa jedná o úlohu na 3D pole, v skutočnosti sa jedná o úlohu na obyčajné 1D pole objektov typu Telefon. Ale o tom až u objektovo orientovaného programovania. Pole si určite ešte vyskúšajte ešte v cvičenie v tomto kurze.

V budúcej lekcii, Kvíz - Textové reťazce v Kotline , sa pozrieme na matematické funkcie a základný kurz Kotlinu dokončíme.

V nasledujúcom kvíze, Kvíz - Textové reťazce v Kotline, si vyskúšame 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é 24x (7.55 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Kotlin

 

Predchádzajúci článok
Riešené úlohy k 9. lekcii Kotlin
Všetky články v sekcii
Základné konštrukcie jazyka Kotlin
Preskočiť článok
(neodporúčame)
Kvíz - Textové reťazce v Kotline
Č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