Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Lekce 10 - Vícerozměrná pole v Kotlin

Kotlin Základy Vícerozměrná pole v Kotlin

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Textové řetězce v Kotlin do třetice - Split, jsme si uvedli metody split() a joinToString() na textových řetězcích. Dnešní lekce je v kurzu základních konstrukcí Kotlin v podstatě bonusová a pojednává o tzv. vícerozměrných polích.

Již umíme pracovat s jednorozměrným polem, které si můžeme představit jako řádku přihrádek v paměti počítače.

Datový typ pole v Kotlin

(Na obrázku je vidět pole osmi čísel)

Ačkoli to není tak časté, v programování se občas setkáváme i s vícerozměrnými poli a to zejména pokud programujeme nějakou simulaci (např. hru).

Dvourozměrné pole

Dvourozměrné pole si můžeme v paměti představit jako tabulku a mohli bychom takto reprezentovat např. rozehranou partii piškvorek. Pokud bychom se chtěli držet reálných aplikací, které budete později v zaměstnání tvořit, můžeme si představit, že do 2D pole budeme ukládat informace o obsazenostech sedadel v kinosálu. Situaci bychom si mohli graficky znázornit např. takto:

Dvourozměrné pole v kotlin

(Na obrázku je vidět 2d pole reprezentující obsazenost kinosálu)

Kinosál by byl v praxi samozřejmě větší, ale jako ukázka nám toto pole postačí. 0 znamená volno, 1 obsazeno. Později bychom mohli doplnit i 2 - rezervováno a podobně. Pro tyto stavy by bylo správnější vytvořit si vlastní datový typ, tzv. výčet, ale s ním se setkáme až později, takže si teď musíme vystačit pouze s čísly.

2D pole inicializujeme v Kotlin následujícím způsobem:

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

Ve skutečnosti se jedná o pole polí. Takže jednotlivým prvkem tohoto pole je zase další pole.

Výše jsme sice dvourozměrné pole úspěšně deklarovali, ale musíme si ho ještě naplnit nulami. Pro vyplnění pole použijeme 2 vnořené cykly. Ten vnější projede řádky, ten vnitřní do každého řádku přidá daný počet nul. Budeme chtít pole o velikosti 5x5:

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

Naše 2D pole si můžeme pro kontrolu vypsat. První cyklus projede jednotlivá pole a ten vnořený potom jejich 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

Naplnění daty

Nyní kinosál naplníme jedničkami tak, jak je vidět na obrázku výše. Protože budeme jako správní programátoři líní, využijeme k vytvoření řádku jedniček for cykly :) Pro přístup k prvku 2D pole musíme samozřejmě zadat 2 souřadnice. Kdybychom pole neměli naplněné nulami (či jinými hodnotami), tak tento kód nebude fungovat.

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

Pro kontrolu můžeme pole opět vypsat:

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-rozměrná pole

Někdy může být příhodné vytvořit si pole o ještě více dimenzích. My všichni si jistě dokážeme představit minimálně 3D pole. S příkladem s kinosálem se nabízí případ užití, kdy má budova více pater (nebo obecně více kinosálů). Vizualizace by vypadala asi nějak takto:

3D pole v Kotlin

3D pole můžeme vytvořit tím samým způsobem, jako 2D pole:

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

Vyplnili bychom ho zase stejně jak před 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
}

Princip je stále stejný, akorát je těžší se v něm orientovat :-)

Kód výše vytvoří 3D pole jako na obrázku. Přistupovat k němu budeme opět přes indexer (hranaté závorky) jako předtím, jen již musíme zadat 3 souřadnice.

kinosaly[1][2][3] = 1 // Druhý kinosál, třetí řada, čtvrtý sloupec

Naše kino bychom si mohli vypsat třeba takto:

var patro = 1

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

Výstup po přiřazení 1 v kódu výše:

Patro: 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
-----------------
Patro: 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
-----------------
Patro: 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ávěr bych rád dodal, že někteří lidé, kteří neumí správně používat objekty, využívají 2D polí k ukládání více údajů o jediné entitě. Např. budeme chtít uložit výšku, šířku a délku pěti mobilních telefonů. Ačkoli se vám nyní může zdát, že se jedná o úlohu na 3D pole, ve skutečnosti se jedná o úlohu na obyčejné 1D pole objektů typu Telefon. Ale o tom až u objektově orientovaného programování. Pole si určitě ještě vyzkoušejte ještě v cvičení v tomto kurzu.

V příští lekci, Matematické funkce v Kotlin, se podíváme na matematické funkce a základní kurz Kotlinu dokončíme.


 

Stáhnout

Staženo 8x (8.4 kB)
Aplikace je včetně zdrojových kódů v jazyce Kotlin

 

 

Článek pro vás napsal Samuel Kodytek
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
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.
Miniatura
Všechny články v sekci
Základní konstrukce jazyka Kotlin
Miniatura
Následující článek
Matematické funkce v Kotlin
Aktivity (3)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!