Lekce 4 - Vícerozměrná pole v Kotlin
V předchozím kvízu, Kvíz - Genericita, seznam a spojový seznam v Kotlin, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
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.

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

(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 5
x5
:
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:
{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
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.
{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}
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 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:
{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ál, třetí řada, čtvrtý sloupec
var patro = 1
for (kinosal in kinosaly) {
println("Patro: $patro")
patro += 1
for (pole in kinosal) {
for (hodnota in pole) {
print("$hodnota ")
}
println()
}
println("-----------------")
}
{/KOTLIN_CONSOLE}
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 v cvičení v tomto
kurzu.
V následujícím cvičení, Řešené úlohy k 1.-4. lekci práce s kolekcemi v Kotlin, si procvičíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 25x (7.55 kB)
Aplikace je včetně zdrojových kódů v jazyce Kotlin