Lekce 7 - Pole v Kotlinu
V minulé lekci kurzu, Typový systém - Null safety v Kotlinu, jsme se naučili používat nullovatelné typy.
Dnes si v Kotlin tutoriálu představíme datovou strukturu pole a vyzkoušíme si, co všechno umí.
Pole
Představme si, že chceme uložit nějaké údaje o více prvcích. Např.
chceme v paměti uchovávat 10 čísel, políčka šachovnice nebo jména 50
uživatelů. Asi nám dojde, že v programování bude nějaká lepší cesta
než začít bušit proměnné uzivatel1
, uzivatel2
až např. uzivatel50
. Nehledě na to, že jich může být třeba
1000! Jak by se pak navíc v takovém systému hledalo? Brrr, takto ne
Potřebujeme-li uchovávat větší množství proměnných stejného
typu, tento problém nám řeší pole. Můžeme si ho představit jako
řadu přihrádek, kdy v každé máme uložený jeden prvek. Přihrádky jsou
očíslované tzv. indexy, přičemž první přihrádka má index
0
.

(Na obrázku je vidět pole osmi čísel)
Programovací jazyky se velmi liší v tom, jak s polem pracují. V některých jazycích (zejména starších, kompilovaných) nebylo možné za běhu programu vytvořit pole s dynamickou velikostí (např. mu dát velikost dle nějaké proměnné). Pole se muselo deklarovat s konstantní velikostí přímo ve zdrojovém kódu. Toto se obcházelo tzv. pointery a vlastními datovými strukturami, což často vedlo k chybám při manuální správě paměti a k nestabilitě programu (např. v C++). Naopak některé interpretované jazyky umožňují nejen deklarovat pole s libovolnou velikostí, ale dokonce tuto velikost na již existujícím poli měnit (např. PHP). Kotlin se řadí k moderním jazykům, nemusíme se tedy o velikost polí starat (dokonce ji ani nemůžeme pevně zadat) a přidávat prvky můžeme i do již vytvořeného pole.
Pole deklarujeme pomocí funkce arrayOf()
:
var pole = arrayOf<Int>()
Výraz pole
je samozřejmě název naší proměnné. Nyní jsme
vytvořili prázdné pole čísel typu Int
.
Nové prvky do pole nejdříve přidáme operátorem +=
. V
našem případě za něj uvedeme přidávané číslo jako Int
,
který se uloží na konec pole:
var pole = arrayOf<Int>() pole += 34
Do pole můžeme takto přidat i další pole stejného typu (tedy v našem
případě typu Int
), jehož prvky se do pole přidají.
K prvkům pole přistupujeme přes hranaté závorky, do nichž uvedeme index prvku. Můžeme to udělat samozřejmě pouze tehdy, když prvek na daném indexu existuje. Zkusme si to:
{KOTLIN_CONSOLE} var pole = arrayOf<Int>() pole += 34 print(pole[0]) {/KOTLIN_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Vypsali jsme prvek na indexu 0
, tedy první, jelikož indexy
jsou číslované od nuly. Na výstupu opravdu vidíme číslo 34
,
které je tam uložené:
34
Plnit pole takto ručně by bylo příliš pracné, proto použijeme cyklus a
naplníme si pole čísly od 1
do 10
. K naplnění
použijeme for
cyklus:
var pole = arrayOf<Int>() for (i in 1..10) { pole += i }
Abychom celé pole vypsali, můžeme za předchozí kód připsat:
{KOTLIN_CONSOLE} var pole = arrayOf<Int>() for (i in 1..10) { pole += i } for (i in pole) { print("$i ") } {/KOTLIN_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Nyní už je lépe vidět síla for
cyklu v Kotlinu. Stačí za
in
místo definované řady čísel vložit pole a cyklus projde
všechny prvky. V těle cyklu k nim poté můžeme přistupovat a například je
vypsat:
1 2 3 4 5 6 7 8 9 10
Pole má vlastnost size
, kde je uložen počet jeho prvků.
Pole samozřejmě můžeme naplnit ručně, aniž bychom museli dosazovat
postupně do každého indexu. Použijeme k tomu funkci arrayOf()
a
do závorek napíšeme prvky, které oddělujeme čárkou. Tentokrát si
zkusíme vytvořit pole textových řetězců:
val simpsonovi = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
Protože nyní nechceme, aby nám někdo obsah pole měnil, deklarujeme ho
pomocí val
, čímž se pole stává konstantním. Vynechali jsme
upřesnění typu, Kotlin z prvků totiž snadno pozná, že jde o pole
řetězců (String
). Samozřejmě nám ale nic nebrání v tom,
abychom typ uvedli:
val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
Pole často slouží k ukládání mezivýsledků, které se potom dále v programu používají. Když potřebujeme nějaký výsledek desetkrát, nebudeme jej desetkrát počítat, ale spočítáme ho jen jednou a uložíme do pole, odtud poté daný výsledek jen načteme.
Metody pole
Na polích nám Kotlin poskytuje pomocné metody pro práci s nimi. Pojďme se na ně podívat:
sort()
a sorted()
Jak již názvy napovídají, metody nám pole seřadí. Metoda
sort()
seřadí již existující pole (takže musí být
deklarované pomocí var
). Metoda sorted()
nám
vrátí nové setříděné pole, takže ho nesmíme zapomenout přiřadit do
proměnné. Metody jsou dokonce tak chytré, že pracují podle toho, co máme v
poli uložené. Řetězce třídí podle abecedy, čísla podle velikosti.
Zkusme si setřídit a vypsat naši rodinku Simpsonových:
{KOTLIN_CONSOLE} val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie") simpsonovi.sort() for (simpson in simpsonovi) { println(simpson) } {/KOTLIN_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Výsledek:
Bart Homer Lisa Marge Meggie
A způsob seřazení pomocí metody sorted()
:
{KOTLIN_CONSOLE} val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie") val simpsonovi_sorted = simpsonovi.sortedArray() for (simpson in simpsonovi_sorted) { println(simpson) } {/KOTLIN_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Bart Homer Lisa Marge Meggie
Zkuste si vytvořit pole čísel a vyzkoušejte si, že to skutečně funguje i pro ně.
reverse()
a
reversedArray()
Tyto metody nám pole otočí (první prvek bude jako poslední atd.).
Princip je opět stejný jako u třídění. Metoda reverse()
otočí existující pole, reversedArray()
nám potom otočené
pole vrátí. To můžeme využít např. pro třídění pozpátku:
{KOTLIN_CONSOLE} val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie") simpsonovi.sort() simpsonovi.reverse() for (simpson in simpsonovi) { println(simpson) } {/KOTLIN_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Výsledek:
Meggie Marge Lisa Homer Bart
indexOf()
Metoda nám najde první výskyt daného prvku v poli a vrátí jeho index
jako Int
. Může se stát, že prvek v poli není, v takovém
případě metoda vrátí -1
. Vytvoříme si jednoduchý program,
který bude předpokládat, že Simpsonovi jsou v poli seřazení podle
oblíbenosti. Když uživatel nějakého zadá, vypíšeme mu to, kolikátý
Simpson je, nebo to, že v poli není.
{KOTLIN_CONSOLE} val simpsonovi = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie") println("Ahoj, zadej svého oblíbeného Simpsona (z rodiny Simpsonů): ") val simpson = readLine()!! val pozice = simpsonovi.indexOf(simpson) if (pozice != -1) { println("Jo, to je můj ${pozice + 1}. nejoblíbenější Simpson!") } else { println("Hele, tohle není Simpson!") } {/KOTLIN_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Výsledek:
Ahoj, zadej svého oblíbeného Simpsona (z rodiny Simpsonů): Homer Jo, to je můj 1. nejoblíbenější Simpson!
size
size
jsme si již zmínili, obsahuje počet prvků v poli. Nejde
o metodu, ale o vlastnost, proto se za ni nepíšou závorky
()
.
isEmpty()
Jak asi tušíte, tato metoda vrátí true
, pokud je naše pole
prázdné. Použití této metody je čitelnější než se ptát pomocí
pole.size == 0
. Z kódu je hned jasné, že nás zajímá možnost,
kdy je pole prázdné.
min()
a max()
Matematické metody, které vrací nejmenší prvek (min()
) a
největší prvek (max()
) v poli. Výsledek vrátí jako
nullovatelný typ, a to pro případ, že by pole bylo prázdné.
first()
a last()
Již podle názvu vlastnosti je zřejmé, že vrátí první a poslední prvek. Návratové hodnoty jsou opět nullovatelné.
contains()
Metoda vrací true
/false
podle toho, zda se prvek
uvedený v parametru metody v daném poli nachází.
To by pro dnešek stačilo, můžete si s polem hrát.
V následujícím kvízu, Kvíz - Podmínky, cykly, pole v Kotlin, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 581x (16.5 kB)