IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

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

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 - Kolekce 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 - Kolekce 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 - Kolekce 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 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 24x (7.55 kB)
Aplikace je včetně zdrojových kódů v jazyce Kotlin

 

Předchozí článek
Kvíz - Genericita, seznam a spojový seznam v Kotlin
Všechny články v sekci
Kolekce v Kotlin
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 1.-4. lekci práce s kolekcemi v Kotlin
Článek pro vás napsal Samuel Kodytek
Avatar
Uživatelské hodnocení:
16 hlasů
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