Množiny, fronty

Datové typy a výjimky v Javě

Jim White

Java Developer

Rozhraní Set

  • Set je také druh Collection
    • Nepřipouští duplicitní objekty
      • Zaručuje jedinečnost každého prvku
    • Objekty Set jsou obecně neuspořádané (nemají index)
  • List je jako dávkovač léků – každý objekt má své místo
  • Set je jako pytel – objekty jsou v něm uloženy náhodně

List je jako dávkovač léků, kde jsou objekty uloženy na konkrétním místě podle indexu

Set je jako pytel, ve kterém jsou objekty uloženy náhodně a bez pořadí

1 Images courtesy Wikimedia Commons
Datové typy a výjimky v Javě

List vs Set

  • Kdy použít Set
    • Zaručuje jedinečnost prvků
    • Rychlejší vyhledávání
      • Ověření, zda objekt existuje v Set
    • Efektivnější využití paměti při růstu kolekce
    • Vhodný pro testování členství v mezipamětech
      • Příklad: nalezení unikátních slov v dokumentu
Datové typy a výjimky v Javě

List vs Set

  • Kdy použít List
    • Zachovává pořadí prvků a umožňuje duplicity
    • Lepší výkon při přístupu k prvkům podle pozice
    • Lepší výkon při přidávání/mazání prvků podle indexu
    • Vhodný tam, kde záleží na pořadí prvků
      • Příklad: kroky sekvence nebo písně v playlistu
Datové typy a výjimky v Javě

Implementace Set

  • Existuje mnoho implementací Set
    • HashSet je oblíbená implementace
  • HashSet
    • Neuspořádaný „pytel" objektů
    • Rychlejší než jiné implementace Set pro vkládání, mazání a vyhledávání
    • Obecně spotřebuje více paměti než jiné implementace Set
    • Umožňuje uložit jediný null

HashSet je neuspořádaný pytel objektů umožňující jeden null

Datové typy a výjimky v Javě

Vytvoření HashSet

  • K vytvoření HashSet použijte generický parametrizovaný konstruktor
    HashSet<String> set = new HashSet<String>();
    
  • HashSet se nachází v balíčku java.util
    • Vyžaduje import
    • import java.util.HashSet
Datové typy a výjimky v Javě

Metody HashSet

  • K přidání a odebrání objektů použijte .add() a .remove()
  • K nahrazení objektu použijte .remove() a poté .add()
  • K ověření existence objektu použijte .contains()
  • Duplicity jsou ignorovány
  • Povoluje null
  • Pořadí není zaručeno
set.add("France");
set.add("Japan");
set.add("Brazil");
set.add("Egypt");
set.add(null); // null is allowed
set.remove("Brazil");
boolean z =
  set.contains("France"); // z is true
set.add("Japan"); // Ignored
System.out.println(set);
[null, Japan, Egypt, France]
Datové typy a výjimky v Javě

Rozhraní Queue

  • Datová struktura Queue zpracovává objekty v pořadí FIFO (first in, first out)
    • První přidaný objekt je odebrán jako první
    • Podobně jako fronta u pokladny
    • Má počáteční (head) a koncový (tail) objekt

Schéma fronty s označeným začátkem (head) a koncem (tail)

  • Existuje několik implementací Queue
    • Podobné chování a operace
Datové typy a výjimky v Javě

ArrayBlockingQueue

  • Oblíbená implementace Queue
    • Interně využívá pole
  • Pozor: ArrayBlockingQueue se nachází v balíčku java.util.concurrent
    • Není součástí balíčku java.util
Datové typy a výjimky v Javě

Vytvoření ArrayBlockingQueue

  • K vytvoření ArrayBlockingQueue použijte generický parametrizovaný konstruktor
    • Kapacita (maximální počet objektů) se zadává v konstruktoru
import java.util.concurrent;  // At the top of the class

// Create new queue that can store 4 Strings
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(4);
Datové typy a výjimky v Javě

Metody ArrayBlockingQueue

  • K přidání na konec (tail) použijte .add(object) nebo .offer(object)
    • .add(object) vyhodí výjimku, pokud je Queue plná
    • .offer(object) nový objekt při plné kapacitě ignoruje
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
queue.offer("France");
queue.offer("Japan");
queue.offer("Brazil");
queue.offer("Egypt");
queue.offer("China"); // Ignores China

// Causes IllegalStateException
// queue.add("China");

System.out.println(queue);
[France, Japan, Brazil, Egypt]
Datové typy a výjimky v Javě

Metody ArrayBlockingQueue

  • K odebrání ze začátku (head) použijte .remove() nebo .poll()
    • .remove() vyhodí výjimku, pokud je Queue prázdná
    • .poll() vrátí null, pokud je Queue prázdná
  • Nepřipouští null
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
String x = queue.poll(); // x is null
// Causes NoSuchElementException
// String y = queue.remove();

queue.offer("France");
String next = queue.poll();
System.out.println(next);
France
Datové typy a výjimky v Javě

Pojďme cvičit!

Datové typy a výjimky v Javě

Preparing Video For Download...