Java: Kontejnery
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				| m (Oprava formátování.) | m (→Úkol 1:  Oprava překlepu) | ||
| (Není zobrazeno 6 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''>(); | ||
| Řádka 27: | Řádka 36: | ||
|   int ''kontejner''.size(); |   int ''kontejner''.size(); | ||
|   boolean ''kontejner''.isEmpty(); |   boolean ''kontejner''.isEmpty(); | ||
| − | |||
| == Procházení kontejneru == | == Procházení kontejneru == | ||
| * Předpokládejme, že máme kontejner instancí třídy <code>Prvek</code>: | * 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>. | + | * 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: | * Zapisujeme: | ||
|   '''for''' (''Prvek'' ''nazevPromenne'' : ''kontejner'') { |   '''for''' (''Prvek'' ''nazevPromenne'' : ''kontejner'') { | ||
| − |      ... ''Práce s konkrétním prvkem (je v proměnné nazevPromenne)''... | + |      // ... ''Práce s konkrétním prvkem (je v proměnné nazevPromenne)''... | 
|   } |   } | ||
| ; Příklady: | ; Příklady: | ||
| ; 1. Vypište jména všech osob v kontejneru instancí třídy <code>Osoba</code> | ; 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) { |   '''for''' (Osoba o : kontejner) { | ||
|      System.out.println(o.getJmeno()); |      System.out.println(o.getJmeno()); | ||
| Řádka 48: | Řádka 59: | ||
| * 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. | * 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: | * 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; |   int vysledek = 0; | ||
|   '''for''' (Ucet u : ucty) { |   '''for''' (Ucet u : ucty) { | ||
| Řádka 54: | Řádka 68: | ||
|   } |   } | ||
|   System.out.println(vysledek); |   System.out.println(vysledek); | ||
| − | |||
| − | |||
| == Přehled syntaxe — srovnání s polem == | == Přehled syntaxe — srovnání s polem == | ||
| Řádka 87: | Řádka 99: | ||
|        a.jed();   |        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>,...)          | ||
| |- | |- | ||
| |} | |} | ||
| Řádka 92: | Řádka 106: | ||
| == Úkoly == | == Ú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 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. | * 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č. | * Všem klientům máte odeslat částku ve výši 100 Kč. | ||
| − | + | === Úkol 3 === | |
| * Máte kontejner instancí třídy <code>Odev</code>. | * 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.) | * 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>. | * 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.LinkedLista 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 Predmetzapíš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řídaUcetmá 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říduPradelnapsát nemusíte.)
-  Vezměte postupně všechny instance třídy Odeva předejte je k oprání vytvořené instanci třídyPradelna.
