Zpět na blog
Vzdělávání

Kolekcie v Jave

Skillmea tím
06.03.2020
6 minut čtení

V tomto úvodnom článku do série pokročilá java sa pozrieme na zúbok kolekciám (collections in java). Kolekcie sú akoby kontajnery, ktoré v sebe držia ďalšie objekty. Inak môžeme kolekcie chápať aj ako zoznamy. Zoznam telefónnych čísel. Zoznam osôb. Zoznam áut. Zoznam súborov. Zoznam čísiel ....

Pri kolekciách budeme hovoriť o Rozhraní, Implementácii a Algoritmoch.

Java collection framework – Java sama o sebe poskytuje niekoľko kolekcií. Poskytuje nám ich implementácie a aj algoritmy na vyhľadávanie, vkladanie, triedenie a podobne. Rozhrania kolekcií v tomto frameworku sú generické. Teda umožňujú do nich vkladať rôzne typy objektov. Pamätajte, že Java je striktne typový jazyk a do premennej typu String proste int nedáš, musí tam ísť iba String. Ku generikám sa ešte dostaneme v neskoršom článku. 


Zoznam rozhraní Java collection frameworku

Collection – top v hierarchii, používa sa na presun kolekcii, manipuláciu kde sa požaduje aby tam prišla akákoľvek kolekcia. Do Collection môžeš vložiť akýkoľvek typ kolekcie, ktorý rozširuje túto kolekciu.

Set – nemôže obsahovať duplicity

List – zoznam, môže obsahovať duplicity, poradie elementov je zachované pomocou indexov

Queue – FIFO – first in first out, čo príde prvé do tejto kolekcie tak z nej aj prvé odíde, niektoré implementácie majú výnimky

Deque – FIFO aj LIFO (last in first out) - elementy môžu byť vkladané aj vyberané z oboch koncov

Map – object ktorý mapuje objekty k ich kľúčom, nemôže obsahovať totožné kľúče

SortedSet a SortedMap – sú vlastne zoradené Map a Set Implementácie (najpoužívanejšie sú zvýraznené boldom):

SetEnumSet, HashSet, LinkedHashSet, TreeSetListArrayList, LinkedList, Stack, VectorMapEnumMap, HashMap, LinkedHashMap, TreeMapSortedSet NavigableSetTreeSetSortedMap NavigableMapTreeMapQueueLinkedList, PriorityQueue

Set

Neobsahuje duplicitné elementy – lepšie povedané nemôže obsahovať duplicitné elementy.

HashSet – neuchováva poradie v akom boli elementy vložené ale pracuje najrýchlejšie

LinkedHashSet – uchováva poradie elementov v akom boli vložené

TreeSet – poradie elementov je zoradené podľa ich hodnôt, je pomalší

Majme kolekciu, ktorá obsahuje elementy, ktoré sú duplicitné. Ako z nej najrýchlejšie získame kolekciu, ktorá nemá duplicity?

Collection<Type> noDups = new HashSet<Type>(c);

Funguje to tak, že z kolekcie sa vytvorí Set. A Set už z definície nemôže obsahovať duplicity. Pridanie elementov do Setu:

Set<String> set1 = new HashSet<>();
  
        String s = "e";
        set1.add("element1");
        set1.add("element2");
        set1.add("element3");
        set1.add("element4");
        set1.add(s);

Je element v kolekcii?

System.out.println(set1.contains("e")); //true

 

Odstránenie elementu z kolekcie:

set1.remove(s);

Prechádzanie cez Set:

Iterator i = set1.iterator();
 while (i.hasNext()){
     System.out.println(i.next());
 }
for(String s : set1) {
     System.out.println(s);
 }

Spýtam sa, či všetky elementy zo set1 sú aj v set2

set1.containsAll(set2)); 

Odstránim z set1 všetky zhodné elementy so set2

set1.removeAll(set2);

Všetko zo set2 pridám do set1

set1.addAll(set2);

List

Uchováva poradie elementov. Elementy sú prístupné aj pomocou indexov. Je možné do už vytvoreného Listu pridať nové elementy aj na indexy ktoré sú obsadené – elementy sa posunú. Môžeme v nich vyhľadávať indexOf a lastIndexOf. Pri Listoch si musíme dávať veľký pozor na to, aby sme nezhodili program kvôli prístupu k neexistujúcim elementom – respektíve k neexistujúcim indexom v Liste. Napríklad, máš List so 4 elementami a chceš pristúpiť k 6-temu elementu.

Základné pomocné algoritmy, špecifické ku List:

  • sort — zotriedi elementy v Liste
  • shuffle — náhodne pomieša elementy v Liste.
  • reverse — otočí poradie elementov v Liste
  • rotate — otočí poradie všetkých elementov od špecifického indexu
  • swap — prehodí elementy z Listu na špecifikovaných indexoch
  • replaceAll — nahradí všetky výskyty špecifikovanej hodnoty za druhú špecifikovanú hodnotu
  • fill — prepíše všetky elementy v Liste za špecifikovanú hodnotu

ArrayList – prispôsobuje svoju veľkosť, základné polia museli mať špecifikovanú dĺžku pri vytvorení, nemohli rásť alebo sa zmenšovať

LinkedList – iná implementácia, rozdielu sú v časových záťažiach s rôznymi operáciami nad Listami

Pridanie elementov do Listu:

List<String> list = new ArrayList<>();

        list.add("list1");

        list.add("list2");

        list.add("list3");

        list.add("list4");

        list.add("list5");

Výber elementu z listu na indexy 1:

        list.get(1);

Je prázdny?

        list.isEmpty();

Pridaj na pozíciu 2:

        list.add(2,"list2b");

Odstráň element:

        list.remove("list1"); 

        list.remove(4);

Rôzne manipulácie:

        Collections.sort(list);

        Collections.shuffle(list);

        Collections.reverse(list);

        Collections.rotate(list,2);

        Collections.swap(list, 0, 1);

        Collections.replaceAll(list, "list4", "new list4");

        Collections.fill(list,"Jaro");

Map

Mapa obsahuje hodnoty viazané na kľúč. Takže to máme po anglicky key – value hodnoty. Kľúče musia byť unikátne.

HashMap – nedrží si poradie, náhodné usporiadanie

LinkedHashMap – drží poradie

Vloženie do Mapy:

Map<Integer,String> map = new HashMap<>();

        map.put(10,"jaro");

        map.put(1,"fero");

        map.put(3,"duro");

        map.put(4000,"karol");

        map.put(4000,"peter"); // prepise predchádzajúci element

Získame a vypíšeme hodnotu elementu s kľúčom 1:

        System.out.println(map.get(1));

Prechod cez elementy Mapy:

        for(Map.Entry m : map.entrySet()){

            System.out.printf("key %d, value %s %n",m.getKey(),m.getValue());

        }

        for(Integer k : map.keySet()){

            map.get(k);         

        }


Skillmea tím

Sme jednotka v online vzdelávaní na Slovensku.

Na našom webe nájdeš viac ako 260 rôznych videokurzov z oblastí ako programovanie, tvorba hier, testovanie softwaru, grafika, UX dizajn, online marketing, MS Office a pod. Vyber si kurz, ktorý ťa posunie vpred ⏩

Mohlo by tě zajímat

Vzdělávání
06.01.2020
Skillmea tím

Kotlin vs. Java - menej kódu

Kotlin a Java sú kompatibilné programovacie jazyky. V tom zmysle, že ak skompilujeme Java kód, tak sa vytvorí bytecode v súbore .class. Ak skompilujem Kotlin kód, tak sa vytvorí bytecode v súbore .class. Teda, či pracuješ v Kotline alebo v Jave, tak nakoniec budeš mať kód, ktorý si bude rozumieť a ktorý dokáže bežať tam, kde dokáže bežať JVM – java virtual machine. V tomto článku vám chcem ukázať to, prečo bol Kotlin vytvorený – aby nám čo najviac zjednodušil písanie kódu. Predstav si, že chceš napísať triedu Auto. Tá má fieldy názov a počet dverí. Tieto fieldy budú private a final – teda po prvom nastavení ich nemôžeš zmeniť. Prístup k týmto fieldom môžeš spraviť len cez public get metódu. Zároveň, vieš zostrojiť auto tak, že mu zadáš len názov. Ak bude zadaný len názov, tak počet dverí bude automaticky 4. Ak zadáš názov a počet dverí, tak sa fieldy nastavia tak, ako sme to zadali v konštruktore. Kód v JaveTakto bude vyzerať kód napísaný v Jave: public class Auto { private final String nazov; private final int pocetDveri; public Auto(String nazov) { this(nazov,4); } public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; } public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; } }Najprv máme dva privátne final fieldy: private final String nazov; private final int pocetDveri;Potom konštruktor, ak chcem vytvoriť objekt auto len pomocou názvu: public Auto2(String nazov) { this(nazov,4); }Konštruktor, ak chcem vytvoriť auto a nastaviť názov a počet dverí: public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; }A nakoniec get metódy, aby sme mali prístup k daným fieldom: public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; }Ako to spravím v Kotline?Potrebujem tento kód: class Auto (val nazov: String, val pocetDveri: Int = 4) { }To je všetko, tých 20 riadkov v Jave je jeden riadok kódu v Kotline. Za Auto sú zátvorky – to je primárny konštruktor, v ktorom sa nastavujú takzvané property. Prvá property je nazov, ktorá je val – val znamená, že hodnota sa nemôže neskôr meniť. Druhá property má nastavené = 4, to znamená, že ak chcem vytvoriť auto len zadaním názvu, tak sa automaticky pocetDveri nastaví na 4. Takto vytvorím Auto zadaním oboch property a pod tým je prístup k property cez bodku: val skoda = Auto("Skoda", 5) skoda.nazov skoda.pocetDveriVytvorenie auta len s názvom: val auticko = Auto("Skoda")Záver Páči sa ti tento prístup? Chceš vedieť viac o programovacom jazyku Kotlin? Sleduj Learn2Code a verím, že nájdeš čo hľadáš. Pripravovaný kurz o Kotline zverejníme už čoskoro.
Vzdělávání
28.11.2019
Skillmea tím

Testovanie Java aplikácií s JUnit

JUnit framework úvodPredstav si úplne jednoduchú metódu, ktorá má za úlohu spočítať dva vstupné parametre metódy. public static int sum(int number1, int number2){ return number1 + number2; }Ako by si otestoval túto metódu? Zavolal by si danú metódu, a následne by si výsledok porovnal s očakávanou hodnotou. Ak by metóda nevrátila očakávanú hodnotu, tak by si napísal hlášku, že test neprešiel, ak by vrátil očakávanú hodnotu, tak by si napísal, že test prešiel. int sumNumber = sum(1, 4); if(sumNumber!=5){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Čo som spravil, je to, že náš kód som porovnal s jedným možným prípadom výsledku. Po anglicky sa stretneš s názvom test case. Teda som zatiaľ spravil jeden test case. Ty by si mal overiť niekoľko test casov. Svoj kód musíš vystaviť „stresu“. Teda si napíšeš niekoľko ďalších test casov. Napríklad, ako to bude pracovať s nulou: int sumNumber = sum(1, 0); if(sumNumber!=1){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Alebo ako to bude pracovať s negatívnym číslom: int sumNumber = sum(1, -10); if(sumNumber!=-9){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Toto boli takzvané pozitívne testy. Test si pokladal za passed – za úspešný – vtedy ak bola splnená podmienka. Ty vieš ale napísať aj takzvané negatívne testy. Kde test prešiel ak nebude splnená podmienka. Napríklad test prejde ak sum 2 a 2 nie je 5 a podobne. int sumNumber = sum(2, 2); if(sumNumber!=5){ System.out.println("Test passed."); }else{ System.err.println("Test failed."); }Náš kód sme vystavili rôznym test casom. Ak testy prejdú, tak metóda je ošetrená určite viac – je viac spoľahlivá ako keby sme nenapísali, žiaden test case. Čo sme spravili? Pripravili sme si testy. Poskytli sme vstupné parametre testom – rôzne čísla na spočítanie. Spustili sme testy a poskytli sme aj očakávané výsledky. Následne sme vypísali hlášky, či testy prešli alebo nie. Ak by sme mali ďalšie metódy, ktoré by sme museli otestovať, tak by sme napísali ďalšie testy. Spravili by sme vlastne tie isté kroky ako pri testovaní prvej metódy. Čo majú prvé testy odlišné od druhých testov? Voláme iné metódy, máme iné parametre testov a máme iné požadované výsledky. Čo majú prvé testy spoločné s druhými testami? Testy sme spustili – na spustení testov nie je nič odlišné. Verifikovali sme výsledky – verifikovanie prebehlo aj v prvom aj v druhom prípade a následne sa v oboch prípadoch napísali hlášky na konzolu. JUnit framework nám uľahčí spôsob, akým budeme spúšťať testy a aj spôsob akým sa používateľovi oznámia výsledky testov. Spustenie, verifikovanie a vypísanie hlášok bude riadiť JUnit framework. My povieme JUnitu – tu máš môj test kód a ty ho teraz spusti a postaraj sa o to. JUnitu povieme, tento výsledok očakávam, tieto údaje vkladám – prever to. JUnit to preverí a nám oznámi v peknej čitateľnej forme, či testy prešli a ak neprešli, tak nám povie presne, ktoré testy neprešli. JUnit bol mnoho rokov vo verzii 4. Verzia 5 nie je priamo kompatibilná s verziou 4, ale tvorcovia JUnit 5 pripravili api, cez ktorú vieme komunikovať aj so starými testami – tá sa volá Vintage. Ďalej nové api sa volá Jupiter. Tieto api potom spoliehajú na core frameworku – teda zdroj – kód, ktorý sa stará o všetko ostatné. Spúšťanie testov a podobne. Plus máš možnosť napísať si svoje vlastné api, ktoré potom bude tiež využívať core frameworku. Ak budeš používať Jupiter plus core, tak si do projektu musíš stiahnuť tieto závislosti. My budeme používať maven pre tieto účely. Vývojové prostredia ako IntelliJ IDEA alebo Eclipse majú zabudovanú integráciu s JUnit 5 frameworkom a tak môžeme testy spúšťať pomocou týchto vývojových prostredí. Ak ťa táto téma zaujíma viac, sleduj online kurz JUnit a TDD pre programátorov.
Vzdělávání
27.02.2019
Skillmea tím

Môžeme sa dnes na hodine hrať? Od zákerného slniečka k programu Scratch

„Môžeme sa dnes na hodine hrať?“ To je otázka, s ktorou sa stretávam na hodinách počas krúžkov programovania.  Keď som začínal s učením, veľmi ma trápilo, aký postoj zaujať k žiakom. Predstavoval som si rôzne katastrofické scenáre, keď žiaci začnú robiť nezbedu od odvrávania až po demolovanie učebne. Ako napomenúť deti? Ako spacifikovať nezbedníkov? Ako ich donútiť spolupracovať? Ako sa odprezentovať, aby som nebol za hlupáka? Ako im správne vysvetliť látku? A to najdôležitejšie: Ako sa postaviť pred dav ľudí, ktorý vám v lepšom prípade venuje pozornosť, a byť schopný zo seba vysúkať zmysluplnú vetu? Začínal som so zákerným slniečkomNejaké skúsenosti som mal s doučovaním spolužiakov na vysokej škole. Pamätám si, ako sme trávili sobotné večery na Skype, kde sme sa snažili donútiť to zákerné slniečko, aby po spustení malo tvar ako na zadanom obrázku. Neskôr som pomáhal spolužiakom pochopiť, čo sa deje s ich domácou úlohou. Nakoniec som do nich tĺkol schopnosti ako si rozobrať zadanie, naplánovať postup, aby samostatne naprogramovali skúškový program. Nedá mi nespomenúť, ako sa mi na strednej škole rozbil počítač a ja som maturitné otázky programoval s ceruzkou na papieri. Čo ale stálo za tým, že som zvládol nakresliť slniečko a potom pripravoval spolužiakov na skúšku? Bol to ten skvelý pocit, že som v podstate z ničoho vytvoril funkčný program, hrateľnú hru, svet s vlastnými postavami. Trénujeme hlavu – každý po svojomPri programovaní si trénujeme to, čo máme v hlave. Musíme myslieť aj na to, že nie každý sa s tým ľahko popasuje. Už som počul aj sťažnosti od detí, aký je to útok na mozog. Deti radi trávia čas pri počítači. Nie každý sa však chce učiť zložité algoritmy. Je potrebné ich naučiť, že počítač nie je len na hranie. Je to aj nástroj, ktorý im umožňuje prejaviť sa. (To by sa ale mohli naučiť aj niektorí rodičia 😊.) Vedú k tomu viaceré cesty. Keď som prvýkrát otvoril prostredie Scratch, bol som nadšený. Prostredie mi ponúka všetko, čo potrebujem na vytvorenie vlastného sveta. Tu máš, pohraj sa s tým, experimentuj, uvidíme, čo z toho vznikne. Nepotrebuješ vedieť zložité informácie, čo sa za tým skrýva alebo prečo to tak funguje. Prostredie ti napovie, toto s týmto sa dá spojiť, a vznikne tamto... Scratch umožní používateľovi vytvoriť veľmi rýchlo jednoduchú hru. Postačí mi zopár klikov a už mi postavička pojedá jabĺčka a pripočítava skóre. Potom to už ide samé. Počítačové hry nie sú zloŽiaci sa tešia na hry, ktoré vytvoríme. A potom začínajú prichádzať otázky: „Kedy si naprogramujeme hru ako GTA V?“ Na to však musím odpovedať, že hru, ktorú vytváralo tisíc ľudí niekoľko rokov, si za jedno popoludnie v Scratchi nenaprogramujeme. Keď si prejdeme základy, púšťame sa do skutočného programovania hier. Často sa pýtam detí na ich vlastné nápady, ktoré potom spolu realizujeme. Snažím sa tak v deťoch podporiť kreativitu. Chcem, aby rozmýšľali nad vlastnými schopnosťami a možnosťami prostredia Scratch. Niekto môže namietať, že počítačové hry sú zlo, ktoré kazí dnešnú mládež. Ja však hovorím, že existujú hry, ktoré vedia deťom veľa priniesť: modelovanie v Minecrafte, manažment a plánovanie v Total War, simulácia života v Simse, budovanie svetov v Age of Empires. Autorom blogu je Ľuboš Jaroš Ľubošove vzdelávacie podklady ku Scratchu nájdete tu. Mgr. Ľuboš JAROŠ je absolvent magisterského stupňa štúdia učiteľstva matematiky a informatiky na FMFI UK (2015). Od začiatku vysokoškolského štúdia sa venoval didaktike programovania, či už v školských prácach alebo pri vedení krúžkov programovania pre žiakov 1. a 2. stupňa, v čom úspešne pokračuje doteraz. Vytvoril kompletné vzdelávacie podklady a videotutoriály pre programy Scratch Junior a Scratch Starter. Je autorom knihy Scratch Starter - Programovanie pre deti (2017). 3 roky na vyžiadanie vedie hodiny didaktiky pre učiteľov informatiky. Jeho obľúbeným pracovným nástrojom je programovacie prostredie pre deti s názvom Scratch.

Nezmeškaj info o nových kurzoch a špeciálnych ponukách