NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
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í.

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.

Struktura pole v Kotlinu - Základní konstrukce jazyka Kotlin

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

Klikni pro editaci
  • var pole = arrayOf<Int>()
    pole += 34
    print(pole[0])
    
    • 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:

    Klikni pro editaci
    • for (i in pole) {
          print("$i ")
      }
      
      • 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:

      Klikni pro editaci
      • val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
        simpsonovi.sort()
        for (simpson in simpsonovi) {
            println(simpson)
        }
        
        • 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():

        Klikni pro editaci
        • val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
          
          val simpsonovi_sorted = simpsonovi.sortedArray()
          for (simpson in simpsonovi_sorted) {
              println(simpson)
          }
          
          • 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:

          Klikni pro editaci
          • val simpsonovi: Array<String> = arrayOf("Homer", "Marge", "Bart", "Lisa", "Meggie")
            simpsonovi.sort()
            simpsonovi.reverse()
            for (simpson in simpsonovi) {
                println(simpson)
            }
            
            • 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í.

            Klikni pro editaci
            • 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!")
              }
              
              • 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ínkami

              Staženo 581x (16.5 kB)

               

              Jak se ti líbí článek?
              Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
              Předchozí článek
              Typový systém - Null safety v Kotlinu
              Všechny články v sekci
              Základní konstrukce jazyka Kotlin
              Přeskočit článek
              (nedoporučujeme)
              Kvíz - Podmínky, cykly, pole v Kotlin
              Článek pro vás napsal Samuel Kodytek
              Avatar
              Uživatelské hodnocení:
              41 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