Java: Kontejnery
Z MiS
(Rozdíly mezi verzemi)
(Vytvoření stránky) |
m (→Úkol 1: Oprava překlepu) |
||
(Není zobrazeno 11 mezilehlých verzí od 1 uživatele.) | |||
Řádka 3: | Řádka 3: | ||
== Kontejner == | == Kontejner == | ||
* Třída, která umožňuje ukládat více objektů. | * Třída, která umožňuje ukládat více objektů. | ||
− | * | + | * Java nabízí velké množství tříd, které fungují jako kontejner. |
+ | * Většina kontejnerů je v balíčku <code>java.util</code>. | ||
+ | * Příklady kontejnerů: <code>java.util.ArrayList</code>, <code>java.util.HashMap</code>, <code>java.util.Deque</code>,... | ||
+ | |||
+ | == Rozhraní List == | ||
+ | * Některé kontejnery jsou navzájem podobné a používají podobné operace. | ||
+ | * Pokud chceme napsat kód tak, že bude moci pracovat s libovolným z podobných kontejnerů, nabízí nám Java ''rozhraní''. | ||
+ | * Příkladem je rozhraní <code>java.util.List</code>. Toto rozhraní implementují třídy: <code>java.util.ArrayList</code>, <code>java.util.LinkedList</code> a další. Poud napíšeme kód s využitím rozhraní <code>List</code>, může uživatel použít kteroukoli z tříd, implementující toto rozhraní. | ||
+ | |||
== Práce s kontejnerem <code>ArrayList</code> == | == Práce s kontejnerem <code>ArrayList</code> == | ||
; Vytvoření kontejneru | ; Vytvoření kontejneru | ||
− | + | * Vytvoření ArrayListu pro ukládání objektů třídy <code>Predmet</code> zapíšeme: | |
− | * | + | List<''Predmet''> ''kontejner'' = new ArrayList<>(); |
− | + | * Ve starých verzích Javy (před verzí 8) bylo nutno psát název třídy dvakrát — i tento zápis můžete potkat: | |
+ | List<''Predmet''> ''kontejner'' = new ArrayList<''Predmet''>(); | ||
; Uložení objektu | ; Uložení objektu | ||
− | kontejner.add(''predmet''); | + | ''kontejner''.add(''predmet''); |
; Získání objektu | ; Získání objektu | ||
− | Predmet kontejner.get(''poradi''); | + | Predmet ''kontejner''.get(''poradi''); |
; Odstranění objektu z kontejneru | ; Odstranění objektu z kontejneru | ||
− | kontejner.remove(''poradi''); | + | ''kontejner''.remove(''poradi''); |
− | kontejner.remove(''predmet''); | + | ''kontejner''.remove(''predmet''); |
− | kontejner.clear(); | + | ''kontejner''.clear(); |
; Zjištění počtu prvků v kontejneru | ; Zjištění počtu prvků v kontejneru | ||
− | int kontejner.size(); | + | int ''kontejner''.size(); |
+ | boolean ''kontejner''.isEmpty(); | ||
+ | |||
+ | == Procházení kontejneru == | ||
+ | * Předpokládejme, že máme kontejner instancí třídy <code>Prvek</code>: | ||
+ | List<Prvek> kontejner = new ArrayList<>(); | ||
+ | * Pokud chceme projít všechny prvky v kontejneru a s každým provést nějakou operaci, pak použijeme cyklus <code>for each</code>. | ||
+ | * Zapisujeme: | ||
+ | '''for''' (''Prvek'' ''nazevPromenne'' : ''kontejner'') { | ||
+ | // ... ''Práce s konkrétním prvkem (je v proměnné nazevPromenne)''... | ||
+ | } | ||
+ | |||
+ | ; Příklady: | ||
+ | ; 1. Vypište jména všech osob v kontejneru instancí třídy <code>Osoba</code> | ||
+ | List<Osoba> kontejner = new ArrayList<>(); | ||
+ | // ... | ||
+ | // ... zde by byl kód, který do kontejneru vloží prvky | ||
+ | // ... | ||
+ | '''for''' (Osoba o : kontejner) { | ||
+ | System.out.println(o.getJmeno()); | ||
+ | } | ||
+ | |||
+ | ; 2. Sečtěte hodnoty všech prvků v poli: | ||
+ | * Máte kontejner instancí třídy <code>Ucet</code>. Třída <code>Ucet</code> má metodu <code>getStav()</code>, která vrací číslo — aktuální stav účtu. | ||
+ | * Sečtěte celkový stav na všech účtech dohromady: | ||
+ | List<Ucet> ucty = new ArrayList<>(); | ||
+ | // ... | ||
+ | // ... zde by byl kód, který do kontejneru vloží prvky | ||
+ | // ... | ||
+ | int vysledek = 0; | ||
+ | '''for''' (Ucet u : ucty) { | ||
+ | vysledek += u.getStav(); | ||
+ | } | ||
+ | System.out.println(vysledek); | ||
+ | |||
+ | == Přehled syntaxe — srovnání s polem == | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! !! <code>ArrayList</code> !! Pole | ||
+ | |- | ||
+ | | Vytvoření kontejneru | ||
+ | | | ||
+ | <code>import java.util.ArrayList;<br /> | ||
+ | ''...''<br/> | ||
+ | ArrayList<Auto> kontejner = new ArrayList<>();</code> | ||
+ | | <code>Auto pole[] = new Auto[''5'']</code> | ||
+ | |- | ||
+ | | Uložení prvku || <code>kontejner.set(''5'', new Auto())</code><br /><code>kontejner.add(new Auto())</code> || <code>pole[''5''] = new Auto()</code> | ||
+ | |- | ||
+ | | Vyzvednutí prvku || <code>kontejner.get(''5'')''.startuj()''</code> || <code>pole[''5''].''startuj()''</code> | ||
+ | |- | ||
+ | | Zjištění počtu prvků || <code>kontejner.size()</code> || <code>pole.length</code> | ||
+ | |- | ||
+ | | Odstranění prvku || <code>kontejner.remove(''auto'');</code><br /><code>kontejner.remove(''3'');</code> || | ||
+ | |- | ||
+ | | Průchod foreach | ||
+ | | | ||
+ | for (Auto a : kontejner) { | ||
+ | a.jed(); | ||
+ | } | ||
+ | | | ||
+ | for (Auto a : pole) { | ||
+ | a.jed(); | ||
+ | } | ||
+ | |- | ||
+ | | Co lze ukládat? || pouze objekty (<code>Integer</code>, <code>Klient</code>,...) || objekty i skalární datové typy (<code>int</code>, <code>boolean</code>,...) | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | |||
+ | == Úkoly == | ||
+ | === Úkol 1 === | ||
+ | * Vytvořte seznam (list) pro uložení celých čísel (použijte třídu <code>Integer</code>). | ||
+ | * Vložte do seznamu 5 náhodně vygenerovaných čísel. Pro generování náhodného čísla můžete využít kód: | ||
+ | Integer nahodne = (int)(Math.random()*99+1); | ||
+ | * Vypište všechna čísla na obrazovku, každé na jeden řádek. | ||
+ | * Vypište součet vygenerovaných čísel. | ||
+ | * Vypište průměrnou hodnotu vygenerovaých čísel. | ||
+ | * Vypište největší číslo v seznamu. | ||
+ | |||
+ | === Úkol 2 === | ||
+ | * Máte kontejner instancí třídy <code>Klient</code>. | ||
+ | * Máte k dispozici metodu <code>odesliPlatbu(Klient k, int castka)</code>. Jedná se o instanční metodu vaší třídy. | ||
+ | * Všem klientům máte odeslat částku ve výši 100 Kč. | ||
+ | |||
+ | === Úkol 3 === | ||
+ | * Máte kontejner instancí třídy <code>Odev</code>. | ||
+ | * Vytvořte instanci třídy <code>Pradelna</code>, třída má metodu <code>oper(Odev o)</code>. (Třídu <code>Pradelna</code> psát nemusíte.) | ||
+ | * Vezměte postupně všechny instance třídy <code>Odev</code> a předejte je k oprání vytvořené instanci třídy <code>Pradelna</code>. |
Aktuální verze z 27. 9. 2022, 09:23
Obsah |
Kontejner
- Třída, která umožňuje ukládat více objektů.
- Java nabízí velké množství tříd, které fungují jako kontejner.
- Většina kontejnerů je v balíčku
java.util
. - Příklady kontejnerů:
java.util.ArrayList
,java.util.HashMap
,java.util.Deque
,...
Rozhraní List
- Některé kontejnery jsou navzájem podobné a používají podobné operace.
- Pokud chceme napsat kód tak, že bude moci pracovat s libovolným z podobných kontejnerů, nabízí nám Java rozhraní.
- Příkladem je rozhraní
java.util.List
. Toto rozhraní implementují třídy:java.util.ArrayList
,java.util.LinkedList
a další. Poud napíšeme kód s využitím rozhraníList
, může uživatel použít kteroukoli z tříd, implementující toto rozhraní.
Práce s kontejnerem ArrayList
- Vytvoření kontejneru
- Vytvoření ArrayListu pro ukládání objektů třídy
Predmet
zapíšeme:
List<Predmet> kontejner = new ArrayList<>();
- Ve starých verzích Javy (před verzí 8) bylo nutno psát název třídy dvakrát — i tento zápis můžete potkat:
List<Predmet> kontejner = new ArrayList<Predmet>();
- Uložení objektu
kontejner.add(predmet);
- Získání objektu
Predmet kontejner.get(poradi);
- Odstranění objektu z kontejneru
kontejner.remove(poradi); kontejner.remove(predmet); kontejner.clear();
- Zjištění počtu prvků v kontejneru
int kontejner.size(); boolean kontejner.isEmpty();
Procházení kontejneru
- Předpokládejme, že máme kontejner instancí třídy
Prvek
:
List<Prvek> kontejner = new ArrayList<>();
- Pokud chceme projít všechny prvky v kontejneru a s každým provést nějakou operaci, pak použijeme cyklus
for each
. - Zapisujeme:
for (Prvek nazevPromenne : kontejner) { // ... Práce s konkrétním prvkem (je v proměnné nazevPromenne)... }
- Příklady
- 1. Vypište jména všech osob v kontejneru instancí třídy
Osoba
List<Osoba> kontejner = new ArrayList<>(); // ... // ... zde by byl kód, který do kontejneru vloží prvky // ... for (Osoba o : kontejner) { System.out.println(o.getJmeno()); }
- 2. Sečtěte hodnoty všech prvků v poli
- Máte kontejner instancí třídy
Ucet
. TřídaUcet
má metodugetStav()
, která vrací číslo — aktuální stav účtu. - Sečtěte celkový stav na všech účtech dohromady:
List<Ucet> ucty = new ArrayList<>(); // ... // ... zde by byl kód, který do kontejneru vloží prvky // ... int vysledek = 0; for (Ucet u : ucty) { vysledek += u.getStav(); } System.out.println(vysledek);
Přehled syntaxe — srovnání s polem
ArrayList |
Pole | |
---|---|---|
Vytvoření kontejneru |
|
Auto pole[] = new Auto[5]
|
Uložení prvku | kontejner.set(5, new Auto()) kontejner.add(new Auto()) |
pole[5] = new Auto()
|
Vyzvednutí prvku | kontejner.get(5).startuj() |
pole[5].startuj()
|
Zjištění počtu prvků | kontejner.size() |
pole.length
|
Odstranění prvku | kontejner.remove(auto); kontejner.remove(3); |
|
Průchod foreach |
for (Auto a : kontejner) { a.jed(); } |
for (Auto a : pole) { a.jed(); } |
Co lze ukládat? | pouze objekty (Integer , Klient ,...) |
objekty i skalární datové typy (int , boolean ,...)
|
Úkoly
Úkol 1
- Vytvořte seznam (list) pro uložení celých čísel (použijte třídu
Integer
). - Vložte do seznamu 5 náhodně vygenerovaných čísel. Pro generování náhodného čísla můžete využít kód:
Integer nahodne = (int)(Math.random()*99+1);
- Vypište všechna čísla na obrazovku, každé na jeden řádek.
- Vypište součet vygenerovaných čísel.
- Vypište průměrnou hodnotu vygenerovaých čísel.
- Vypište největší číslo v seznamu.
Úkol 2
- Máte kontejner instancí třídy
Klient
. - Máte k dispozici metodu
odesliPlatbu(Klient k, int castka)
. Jedná se o instanční metodu vaší třídy. - Všem klientům máte odeslat částku ve výši 100 Kč.
Úkol 3
- Máte kontejner instancí třídy
Odev
. - Vytvořte instanci třídy
Pradelna
, třída má metoduoper(Odev o)
. (TříduPradelna
psát nemusíte.) - Vezměte postupně všechny instance třídy
Odev
a předejte je k oprání vytvořené instanci třídyPradelna
.