Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

11. diel - ArrayList v Jave

V predchádzajúcom kvíze, Kvíz - Dedičnosť, statika, gettery a settery v Jave OOP, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.

Dnes si v tutoriáli ukážeme jednu kolekciu, ktorá je múdrejší, než pole. Umožňuje totiž prvky ľubovoľne pridávať a mazať.

Pojem kolekcie sme tu už spomínali. Je to štruktúra, do ktorej môžeme ukladať viacero objektov. Kolekcií je v Jave veľké množstvo, sú uspôsobené na rôzne účely a môžeme s nimi zaobchádzať rôznymi spôsobmi. Preto im je venovaná celá sekcia. Doteraz poznáme iba kolekciu poľa. V priebehu seriálu však budeme potrebovať niečo múdrejšie, kam budeme môcť jednoducho za behu programu pridávať a mazať záznamy. Iste by sa nám hodilo si v pamäti spravovať databázu nejakých objektov. Vieme, že pole má konštantnú veľkosť, čo je daň za jeho vysokú rýchlosť. Teraz si predstavíme triedu ArrayList, ktorú môžeme už podľa názvu chápať ako nadstavbu poľa.

ArrayList

ArrayList je tzv. generická kolekcia. Pojem genericita si plne vysvetlíme až pri kolekciách, teraz nám bude stačiť vedieť, že pri deklarácii kolekcie ArrayList špecifikujeme dátový typ objektov, ktoré v ňom budú uložené. Začnime jednoducho a urobme si ArrayList čísel, ktoré budeme náhodne žrebovať.

Žrebovanie

Program sa nás vždy spýta, či chceme losovať ďalšie číslo a to sa pridá do kolekcie ArrayList. Pokiaľ už nebudeme chcieť žrebovať, program vypíše žrebované čísla, zoradené od najmenšieho po najväčšie. Založme si nový projekt Losovani a vytvorme si triedu Losovac. Trieda bude obsahovať kolekciu ArrayList typu Integer, kde budú čísla uložené.

Narážame na triedu Integer, ktorá slúži na uloženie celých čísel av podstate obaľuje dátový typ int. Do ArrayListu sa totiž dajú vkladať iba objekty, teda premenné referenčného typu. Na tieto účely existuje typ Integer. Ku každému primitívnemu typu v Jave existuje jeho referenčný "obal", čoskoro si ich uvedieme. Kolekcia ArrayList bude privátna a bude slúžiť iba ako interné úložisko danej triedy, aby sa naň zvonku nedalo pristupovať.

Kolekciu ArrayList deklarujeme takto:

Dátový typ píšeme pri generických kolekciách do špicatých zátvoriek. Kolekcia ArrayList je samozrejme objekt, ako každý iný. Rovnako ako pri poli a iných objektoch, aj tu premennú pred použitím inicializujeme:

Všimnite si zátvorku, ktorú označuje konštruktor. Takýto list teda umiestnime do našej triedy, spolu s náhodným generátorom Random. Pre prácu s triedou ArrayList je potrebné pridať import java.util.ArrayList. V konštruktore atribúty inicializujeme:

Ďalej pridáme metódy losuj() a vypis(), kde losuj() pridá do ArrayListu nové náhodné číslo a taktiež ho vráti ako návratovú hodnotu. Metóda vypis() vráti textový reťazec na vypísanie. Ten bude obsahovať čísla z kolekcie cisla, zoradené a oddelené medzerou.

Žrebovanie náhodného čísla už poznáme z dielu o hracej kocke, tu budeme vyhadzovať čísla od 1 do 100. Číslo do ArrayListu pridáme pomocou metódy add():

Veľmi jednoduché, že? Kolekcia ArrayList je interne pomerne zložitá a zatiaľ sa nebudeme zaoberať tým, čo sa vo vnútri deje. To je napokon účel Javy, ponúkať kvalitné a sofistikované komponenty, ktoré sa jednoducho používajú.

Výpis čísel bude ešte jednoduchší. Na zotriedenie kolekcie ArrayList použijeme metódu sort() z triedy Collections, ktorá list zotriedi. Bude teda potrebné importovať java.util.Collections. Metóda nič nevracia, iba ArrayList zotriedi vo vnútri:

Hotovo.

Presuňme sa do metódy main() a pomocou cyklu while umožnime užívateľovi ovládať objekt. Podobný program bola kalkulačka z prvých lekcií, kde sme sa v cykle pýtali, či si užívateľ praje opakovať výpočet. Tu budeme postupovať totožne.

Ovládanie bude pomocou možností 1, 2, 3 (losuj, vypíš, koniec). Budeme ich načítať pomocou metódy scanner.nextLine() ako String:

Nezabudneme na import triedy Scanner. IDE väčšinou toto zvládne robiť za nás :)

  • V IntelliJ stačí napríklad stlačenie klávesu Tab pri písaní triedy Scanner: Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
  • V NetBeans stačí kliknúť pravým tlačidlom na triedu Scanner a zvoliť z ponuky Fix imports, prípadne použiť klávesovú skratku Ctrl + Shift + I.
Priebeh programu je z kódu dobre viditeľný, najskôr nastavíme voľbu na nejakú východiskovú hodnotu, aby cyklus prvýkrát prebehol. Potom voľbu načítame z klávesnice. String spracujeme pomocou konštrukcie switch a vykonáme príslušné akcie. Pokiaľ bolo zadané niečo iné, pokryje to možnosť default:

Vidíme, že môžeme stále pridávať nové a nové čísla. Máme oveľa väčšie možnosti ako s poľom. Zároveň však môžeme s ArrayListom pracovať podobne, ako sme pracovali s poľom.

Na prístup môžeme využiť metódy get() a set(), ale pozor, prvok musí existovať. Skúsme si napísať nasledujúci kód:

Vytvoríme si list textových reťazcov. Pridáme položku Prvá a potom vypíšeme položku na indexe 0. Vypíše sa nám První. Môžeme na ňu samozrejme aj takto zapisovať. S druhou položkou na pozícii 1 však už nemôžeme pracovať, pretože sme ju do listu nepridali. Pri poli sme zadali veľkosť a on všetky "priehradky" (premenné pod indexy) založil. Teraz veľkosť nezadávame a "priehradky" si pridávame sami.

Pozrime sa na ArrayList podrobnejšie a vypíšme si metódy, ktoré sú pre nás teraz zaujímavé.

Konštruktory

Okrem prázdneho ArrayListu môžeme List vytvoriť aj ako kópiu z iného listu, poľa alebo inej kolekcie. Stačí kolekciu odovzdať do konštruktora:

Kód vyššie vypíše Třetí:

Prvky poľa sa do nového hárka skopírujú. Rovnako môžeme odovzdať aj iný ArrayList.

Metódy na triede ArrayList

Ukážeme si pár dôležitých metód, ktoré môžeme volať na triede ArrayList:

  • size() - Funguje ako metóda length() na poli, vracia počet prvkov v kolekcii.
  • add(položka) - Metódu add() sme si už vyskúšali, ako parameter berie položku, ktorú vloží do listu.
  • addAll(kolekce) - Pridá do listu viac položiek, napr. z poľa.
  • clear() - Odstráni všetky položky v liste.
  • contains(položka) - Vracia hodnoty true alebo false podľa toho, či ArrayList obsahuje odovzdanú položku.
  • indexOf(položka) - Vráti index prvého výskytu položky (ako pri poli). Vracia hodnotu -1 pri neúspechu.
  • lastIndexOf(položka) - Vracia index posledného výskytu položky v liste. Vracia hodnotu -1 pri neúspechu.
  • remove(index) - Odstráni položku na danom indexe.
  • removeAll(kolekce) - Odstráni všetky položky v liste (podobná ako metóda clear(), ale pomalšia - robí ďalšie kroky navyše)
  • toArray() - Skopíruje položky z ArrayListu do poľa a to vráti.
Ďalšie metódy

Ďalšie metódy a pre prácu s listom nájdeme v triede Collections. Ako parameter berú danú kolekciu:

  • min() - Vráti najmenší prvok z kolekcie.
  • max() - Vráti najväčší prvok z kolekcie.
  • reverse() - Obráti list tak, že je prvá položka posledná a naopak. Metóda nič nevracia, zmeny sa vykonajú v zadanom liste.
  • sort() - Metódu sort() už tiež poznáme, zotriedi položky v liste. Metóda opäť nič nevracia.
Vidíme, že kolekcia ArrayList toho dokáže oveľa viac ako pole. Najväčšou výhodou je pridávanie a mazanie prvkov. Daň vo výkone je zanedbateľná. V sekcii s kolekciami zistíme, že kolekcia ArrayList má ešte ďalšie metódy, ale zatiaľ nemáme skúsenosti.

Program pre ukladanie žrebovaných čísel bol zaujímavý, ale určite sa nám bude v budúcnosti hodiť ukladať skôr plnohodnotné objekty, než čísla.

V nasledujúcom cvičení, Riešené úlohy k 11. lekcii OOP v Jave, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 984x (23.1 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Kvíz - Dedičnosť, statika, gettery a settery v Jave OOP
Všetky články v sekcii
Objektovo orientované programovanie v Jave
Preskočiť článok
(neodporúčame)
Riešené úlohy k 11. lekcii OOP v Jave
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity