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.
(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:
(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:
{KOTLIN_CONSOLE}
var kinosal = arrayOf<Array<Int>>()
for (i in 0..4) {
var pole = arrayOf<Int>()
for (j in 0..4) {
pole += 0
}
kinosal += pole
}
for (pole in kinosal) {
for (hodnota in pole) {
print("$hodnota ")
}
println()
}
{/KOTLIN_CONSOLE}
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ť.
{KOTLIN_CONSOLE}
var kinosal = arrayOf<Array<Int>>()
for (i in 0..4) {
var pole = arrayOf<Int>()
for (j in 0..4) {
pole += 0
}
kinosal += pole
}
kinosal[2][2] = 1
for (i in 1..3) {
kinosal[3][i] = 1
}
for (i in 0..4) {
kinosal[4][i] = 1
}
for (pole in kinosal) {
for (hodnota in pole) {
print("$hodnota ")
}
println()
}
{/KOTLIN_CONSOLE}
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 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:
{KOTLIN_CONSOLE}
var kinosaly = arrayOf<Array<Array<Int>>>()
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
}
kinosaly[1][2][3] = 1 // Druhý kinosála, tretí rad, štvrtý stĺpec
var patro = 1
for (kinosal in kinosaly) {
println("Poschodie: $patro")
patro += 1
for (pole in kinosal) {
for (hodnota in pole) {
print("$hodnota ")
}
println()
}
println("-----------------")
}
{/KOTLIN_CONSOLE}
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é 25x (7.55 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Kotlin