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

Kolekce v Javě

Skillmea
06.03.2020
6 minut čtení
Kolekce v Javě
V tomto úvodním článku do série pokročilá java se podíváme na zoubek kolekcím (collections in java). Kolekce jsou jako kontejnery, které v sobě drží další objekty. Jinak můžeme kolekce chápat také jako seznamy. Seznam telefonních čísel. Seznam osob. Seznam aut. Seznam souborů. Seznam čísel ....

U kolekcí budeme hovořit o Rozhrání, Implementaci a Algoritmech.

Java collection framework – Java sama o sobě poskytuje několik kolekcí. Poskytuje nám jejich implementace a také algoritmy pro vyhledávání, vkládání, třídění a podobně. Rozhraní kolekcí v tomto frameworku jsou generická. Tedy umožňují do nich vkládat různé typy objektů. Pamatujte, že Java je striktně typový jazyk a do proměnné typu String prostě int nedáš, musí tam jít pouze String. Ke generikám se ještě dostaneme v pozdějším článku.

Seznam rozhraní Java collection frameworku

Collection – top v hierarchii, používá se k přesunu kolekce, manipulaci kde se požaduje aby tam přišla jakákoliv kolekce. Do Collection můžeš vložit jakýkoli typ kolekce, který tuto kolekci rozšiřuje.
Set – nemůže obsahovat duplicity
List – seznam, může obsahovat duplicity, pořadí elementů je zachováno pomocí indexů
Queue – FIFO – first in first out, což přijde první do této kolekce tak z ní i první odejde, některé implementace mají výjimky
Deque - FIFO i LIFO (last in first out) - elementy mohou být vkládány i vybírány z obou konců
Map – object který mapuje objekty k jejich klíčům, nemůže obsahovat totožné klíče
SortedSet a SortedMap – jsou vlastně seřazeny Map a Set Implementace

(nejpoužívanější jsou zvýrazněny boldem):
SetEnumSet, HashSet, LinkedHashSet, TreeSetListArrayList, LinkedList, Stack, VectorMapEnumMap, HashMap, LinkedHashMap, TreeMapSortedSet NavigableSetTreeSetSortedMap NavigableMapTreeMapQueueLinkedList, PriorityQueue 

Set

Neobsahuje duplicitní elementy – lépe řečeno nemůže obsahovat duplicitní elementy.

HashSet – neuchovává pořadí v jakém byly elementy vloženy, ale pracuje nejrychleji

LinkedHashSet – uchovává pořadí elementů v jakém byly vloženy

TreeSet – pořadí elementů je seřazeno podle jejich hodnot, je pomalejší

Mějme kolekci, která obsahuje elementy, které jsou duplicitní. Jak z ní nejrychleji získáme kolekci, která nemá duplicity?

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

Funguje to tak, že z kolekce se vytvoří Set. A Set už z definice nemůže obsahovat duplicity. Přidání elementů 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 kolekci? 
System.out.println(set1.contains("e")); //true 
  
Odstranění elementu z kolekce:
set1.remove(s);
Procházení přes Set:
Iterator i = set1.iterator();
 while (i.hasNext()){
     System.out.println(i.next());
 }for(String s : set1) {
     System.out.println(s);
 }
Zeptám se, jestli všechny elementy ze set1 jsou iv set2
set1.containsAll(set2)); 
Odstraním z set1 všechny shodné elementy se set2
set1.removeAll(set2);
Vše ze set2 přidám do set1
set1.addAll(set2);

List

Uchovává pořadí elementů. Elementy jsou přístupné i pomocí indexů. Je možné do již vytvořeného Listu přidat nové elementy i na indexy, které jsou obsazeny – elementy se posunou. Můžeme v nich vyhledávat indexOf a lastIndexOf. U dopisů si musíme dávat velký pozor na to, abychom neshodili program kvůli přístupu k neexistujícím elementům – respektive k neexistujícím indexům v listu. Například máš List se 4 elementy a chceš přistoupit k 6-tému elementu.

Základní pomocné algoritmy, specifické ke List: 
  • sort — setřídí elementy v listu
  • shuffle — náhodně promíchá elementy v listu.
  • reverse — otočí pořadí elementů v Liste
  • rotate — otočí pořadí všech elementů od specifického indexu
  • swap — přehodí elementy z Listu na specifikovaných indexech
  • replaceAll — nahradí všechny výskyty specifikované hodnoty za druhou specifikovanou hodnotu
  • fill — přepíše všechny elementy v listu za specifikovanou hodnotu
ArrayList – přizpůsobuje svou velikost, základní pole musela mít specifikovanou délku při vytvoření, nemohla růst nebo se zmenšovat
LinkedList – jiná implementace, rozdílu jsou v časových zátěžích s různými operacemi nad Listy

Přidání elementů do Listu:
List<String> list = new ArrayList<>(); 
        list.add("list1"); 
        list.add("list2"); 
        list.add("list3"); 
        list.add("list4"); 
        list.add("list5"); 
Výběr elementů z listu na indexy 1:
        list.get(1); 
Je prázdný?
        list.isEmpty(); 
Přidej na pozici 2:
        list.add(2,"list2b"); 
Odstraň element:
        list.remove("list1");  
        list.remove(4); 
Různé manipulace:
        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 vázané na klíč. Takže to máme anglicky key – value hodnoty. Klíče musí být unikátní.
HashMap – nedrží si pořadí, náhodné uspořádání
LinkedHashMap – drží pořadí
Vložení 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"); // přepíše předchozí element
Získáme a vypíšeme hodnotu elementu s klíčem 1:
        System.out.println(map.get(1)); 
Přechod přes 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
🥇 Sme jednotka v online vzdelávaní na Slovensku.
Na našom webe nájdeš viac ako 300 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

Kotlin vs. Java - méně kódu
Vzdělávání
06.01.2020
Skillmea

Kotlin vs. Java - méně kódu

Kotlin a Java jsou kompatibilní programovací jazyky. V tom smyslu, že pokud zkompilujeme Java kód, tak se vytvoří bytecode v souboru .class. Pokud zkompiluji Kotlin kód, tak se vytvoří bytecode v souboru .class. Tedy, jestli pracuješ v Kotlině nebo v Javě, tak nakonec budeš mít kód, který si bude rozumět a který dokáže běžet tam, kde dokáže běžet JVM – java virtual machine. V tomto článku vám chci ukázat to, proč byl Kotlin vytvořen – aby nám co nejvíce zjednodušil psaní kódu. Představ si, že chceš napsat třídu Auto. Ta má fieldy název a počet dveří. Tyto fieldy budou private a final – tedy po prvním nastavení je nemůžeš změnit. Přístup k těmto fieldům můžeš udělat jen přes public get metodu. Zároveň umíš sestrojit auto tak, že mu zadáš jen název. Pokud bude zadán jen název, tak počet dveří bude automaticky 4. Pokud zadáš název a počet dveří, tak se fieldy nastaví tak, jak jsme to zadali v konstruktoru. Kód v JavěTakto bude vypadat kód napsaný v Javě: 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; } }Nejprve máme dva privátní final fieldy: private final String nazov; private final int pocetDveri;Pak konstruktor, pokud chci vytvořit objekt auto jen pomocí názvu: public Auto2(String nazov) { this(nazov,4); } Konstruktor, pokud chci vytvořit auto a nastavit název a počet dveří: public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; }A nakonec get metody, abychom měli přístup k daným fieldům: public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; }Jak to udělám v Kotlině?Potřebuji tento kód: class Auto (val nazov: String, val pocetDveri: Int = 4) { }To je všechno, těch 20 řádků v Javě je jeden řádek kódu v Kotlině. Za Auto jsou závorky - to je primární konstruktor, ve kterém se nastavují takzvané property. První property je název, který je val – val znamená, že hodnota se nemůže později měnit. Druhá property má nastaveno = 4, to znamená, že pokud chci vytvořit auto jen zadáním názvu, tak se automaticky pocetDveři nastaví na 4. Takto vytvořím Auto zadáním obou property a pod tím je přístup k property přes tečku: val skoda = Auto("Skoda", 5) skoda.nazov skoda.pocetDveriVytvoření auta jen s názvem: val auticko = Auto("Skoda")Záver Líbí se ti tento přístup? Chceš vědět více o programovacím jazyce Kotlin? Sleduj Learn2Code a věřím, že najdeš co hledáš. Připravovaný kurz o Kotlině zveřejníme již brzy.
Testování Java aplikací s JUnit
Vzdělávání
28.11.2019
Skillmea

Testování Java aplikací s JUnit

JUnit framework úvodPředstav si naprosto jednoduchou metodu, která má za úkol spočítat dva vstupní parametry metody. public static int sum(int number1, int number2){ return number1 + number2; }Jak bys otestoval tuto metodu? Zavolal bys danou metodu, a následně bys výsledek porovnal s očekávanou hodnotou. Pokud by metoda nevrátila očekávanou hodnotu, tak bys napsal hlášku, že test neprošel, pokud by vrátil očekávanou hodnotu, tak bys napsal, že test prošel. int sumNumber = sum(1, 4); if(sumNumber!=5){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Co jsem udělal, je to, že náš kód jsem porovnal s jedním možným případem výsledku. Anglicky se setkáš s názvem test case. Tedy jsem zatím udělal jeden test case. Ty bys měl ověřit několik test časů. Svůj kód musíš vystavit „stresu“. Tedy si napíšeš několik dalších test časů. Například, jak to bude pracovat s nulou: int sumNumber = sum(1, 0); if(sumNumber!=1){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Nebo jak to bude pracovat s negativním číslem: int sumNumber = sum(1, -10); if(sumNumber!=-9){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Toto byly takzvané pozitivní testy. Test si považoval za passed – za úspěšný – tehdy, když byla splněna podmínka. Ty umíš ale napsat i takzvané negativní testy. Kde test prošel, pokud nebude splněna podmínka. Například test projde-li částek 2 a 2 není 5 a podobně. int sumNumber = sum(2, 2); if(sumNumber!=5){ System.out.println("Test passed."); }else{ System.err.println("Test failed."); }Náš kód jsme vystavili různým testům casem. Pokud testy projdou, tak metoda je ošetřena určitě víc – je více spolehlivá než kdybychom nenapsali, žádný test case. Co jsme udělali?Připravili jsme si testy. Poskytli jsme vstupní parametry testům – různá čísla ke spočítání. Spustili jsme testy a poskytli jsme také očekávané výsledky. Následně jsme vypsali hlášky, zda testy prošly nebo ne. Pokud bychom měli další metody, které bychom museli otestovat, pak bychom napsali další testy. Udělali bychom vlastně tytéž kroky jako při testování první metody. Co mají první testy odlišné od druhých testů? Voláme jiné metody, máme jiné parametry testů a máme jiné požadované výsledky. Co mají první testy společného s druhými testy? Testy jsme spustili – ke spuštění testů není nic odlišného. Verifikovali jsme výsledky – verifikování proběhlo iv prvním i druhém případě a následně se v obou případech napsaly hlášky na konzoli. JUnit framework nám usnadní způsob, jakým budeme spouštět testy a také způsob, jakým se uživateli sdělí výsledky testů. Spuštění, verifikování a vypsání hlášek bude řídit JUnit framework. My řekneme JUnitu – tady máš můj test kód a ty ho teď spusti a postarej se o to. JUnitu řekneme, tento výsledek očekávám, tyto údaje vkládám - prověřit to. JUnit to prověří a nám sdělí v pěkné čitelné formě, zda testy prošly a pokud neprošly, tak nám řekne přesně, které testy neprošly.[Image]JUnit byl mnoho let ve verzi 4. Verze 5 není přímo kompatibilní s verzí 4, ale tvůrci JUnit 5 připravili api, přes kterou umíme komunikovat i se starými testy – ta se jmenuje Vintage. Dále nové api se jmenuje Jupiter. Tyto api pak spoléhají na core frameworku – tedy zdroj – kód, který se stará o všechno ostatní. Spouštění testů a podobně. Plus máš možnost napsat své vlastní api, které pak bude také využívat core frameworku. Pokud budeš používat Jupiter plus core, tak si do projektu musíš stáhnout tyto závislosti. My budeme používat maven pro tyto účely. Vývojová prostředí jako IntelliJ IDEA nebo Eclipse mají zabudovanou integraci s JUnit 5 frameworkem a tak můžeme testy spouštět pomocí těchto vývojových prostředí. Pokud tě toto téma zajímá víc, sleduj online kurz JUnit a TDD pro programátory.
Můžeme si dnes na hodině hrát? Od záludného sluníčka k programu Scratch
Vzdělávání
27.02.2019
Skillmea

Můžeme si dnes na hodině hrát? Od záludného sluníčka k programu Scratch

„Můžeme si dnes na hodině hrát?“ To je otázka, se kterou se setkávám na hodinách během kroužků programování. Když jsem začínal s učením, velmi mě trápilo, jaký postoj zaujmout k žákům. Představoval jsem si různé katastrofické scénáře, když žáci začnou dělat nezbedu od odmlouvání až po demolování učebny. Jak napomenout děti? Jak zpacifikovat rošťáky? Jak je donutit spolupracovat? Jak se odprezentovat, abych nebyl za hlupáka? Jak jim správně vysvětlit látku? A to nejdůležitější: Jak se postavit před dav lidí, který vám v lepším případě věnuje pozornost, a být schopen ze sebe vysoukat smysluplnou větu? Začínal jsem se záludným sluníčkemNějaké zkušenosti jsem měl s doučováním spolužáků na vysoké škole. Pamatuji si, jak jsme trávili sobotní večery na Skype, kde jsme se snažili donutit to záludné sluníčko, aby po spuštění mělo tvar jako na zadaném obrázku. Později jsem pomáhal spolužákům pochopit, co se děje s jejich domácím úkolem. Nakonec jsem do nich tloukl schopnosti jak si rozebrat zadání, naplánovat postup, aby samostatně naprogramovali zkouškový program. Nedá mi nevzpomenout, jak se mi na střední škole rozbil počítač a já jsem maturitní otázky programoval s tužkou na papíře. Co ale stálo za tím, že jsem zvládl nakreslit sluníčko a potom připravoval spolužáky na zkoušku? Byl to ten skvělý pocit, že jsem v podstatě z ničeho vytvořil funkční program, hratelnou hru, svět s vlastními postavami.[Image] Trénujeme hlavu – každý po svémPři programování si trénujeme to, co máme v hlavě. Musíme myslet i na to, že ne každý se s tím snadno popasuje. Už jsem slyšel také stížnosti od dětí, jaký je to útok na mozek. Děti rádi tráví čas u počítače. Ne každý se ale chce učit složité algoritmy. Je třeba je naučit, že počítač není jen na hraní. Je to také nástroj, který jim umožňuje projevit se. (To by se ale mohli naučit i někteří rodiče 😊.) Vedou k tomu několik cest. Když jsem poprvé otevřel prostředí Scratch, byl jsem nadšený. Prostředí mi nabízí vše, co potřebuji k vytvoření vlastního světa. Tady máš, pohraj si s tím, experimentuj, uvidíme, co z toho vznikne. Nepotřebuješ vědět složité informace, co se za tím skrývá nebo proč tomu tak funguje. Prostředí ti napoví, toto s tímto se dá spojit, a vznikne támhle... Scratch umožní uživateli vytvořit velmi rychle jednoduchou hru. Postačí mi pár kliků a už mi postavička pojídá jablíčka a připočítává skóre. Pak už to jde samé.[Image] Počítačové hry nejsou zloŽáci se těší na hry, které vytvoříme. A pak začínají přicházet otázky: „Kdy si naprogramujeme hru jako GTA V?“ Na to však musím odpovědět, že hru, kterou vytvářelo tisíc lidí několik let, si za jedno odpoledne ve Scratchi nenaprogramujeme. Když si projdeme základy, pouštíme se do skutečného programování her. Často se ptám dětí na jejich vlastní nápady, které pak spolu realizujeme. Snažím se tak v dětech podpořit kreativitu. Chci, aby přemýšleli nad vlastními schopnostmi a možnostmi prostředí Scratch. Někdo může namítat, že počítačové hry jsou zlo, které kazí dnešní mládež. Já však říkám, že existují hry, které umí dětem hodně přinést: modelování v Minecraftu, management a plánování v Total War, simulace života v Simsu, budování světů v Age of Empires.[Image] Autorem blogu je Ľuboš Jaroš Ľubošovy vzdělávací podklady ke Scratchu naleznete tu. Mgr. Ľuboš JAROŠ je absolvent magisterského stupně studia učitelství matematiky a informatiky na FMFI UK (2015). Od začátku vysokoškolského studia se věnoval didaktice programování, ať už ve školních pracích nebo při vedení kroužků programování pro žáky 1. a 2. stupně, v čemž úspěšně pokračuje dosud. Vytvořil kompletní vzdělávací podklady a videotutoriály pro programy Scratch Junior a Scratch Starter. Je autorem knihy Scratch Starter - Programování pro děti (2017). 3 roky na vyžádání vede hodiny didaktiky pro učitele informatiky. Jeho oblíbeným pracovním nástrojem je programovací prostředí pro děti s názvem Scratch.

Nezmeškej info o nových kurzech a speciálních nabídkách