Warning
This page is located in archive.

Reversi I

  • Poslední konzultace a dokončení úlohy Spam filter.
  • Lehký úvod do objektů v Javě, rozdíly proti Pythonu
  • Představení 3. úlohy Reversi

Domácí úkol

Nadcházející neděli do 23:59:59 je třeba odevzdat finální spam filtr podle specifikací.

  • Dokončit krok 1 pro úlohu Reversi, tj.:
    • Nakonfigurovaný a spustitelný projekt
    • Vytvořený vlastní hráč

Java

Poslední semestrální úlohu budete řešit v Javě. Tu už znáte z Programování 1 a tak si jen v rychlosti ukážeme pár rozdílů v syntaxi oproti Pythonu:

  • deklarace proměnných spolu s jejich typem:
     int i = 1;
  • volani konstruktoru pomocí new:
     Object o = new Object();
  • deklarace typu návratových hodnot a vstupních parametrů metod
  • self/this:
    • oboje odkazuje na konkrétní instanci objektu, v Javě se neuvádí this jako jeden z parametrů metod
    • this není potřeba používat pro volání metod třídy a odkazování na proměnné třídy, pokud je volání jednoznačné:

        void setValue(int value){
          this.value = value
        } 

  • Specifikátory přístupu
třída podtřída balík ostatní
public x x x x
protected x x x
package x x
private x
  • final
    • třída - nelze od ní dědit
    • metoda - nelze ji měnit v odděděných třídách
    • proměnná - po inicializaci nemůže být její hodnota změněna
  • static
    • Značí že proměnná(nebo metoda) není proměnnou instance, ale proměnnou třídy.
    • Každá instance třídy (objekt) má vlastní kopii proměnné instance. Proměnná třídy je pouze jedna a instance přistupují stále k té samé proměnné.
    • Statické metody je možné narozdíl od nestatických volat i tehdy, neexistuje-li žádná instance dané třídy. Podobně se statickými proměnnými.
    • K proměnným třídy přistupujeme jménem třídy.
    • Statické metody nemůžou přistupovat k proměnným instance (objektu), protože není definváno k proměnným kterého objektu přistupovat.

Pokročilé datové struktury v Javě

Primitivní nativní typy

  • Java nativně podporuje 8 primitivních typů - byte, short, int, long, float, double, boolean, char
  • Někdy není možné primitivní typy použít. Java poskytuje obalující typy (wrapper types), které jsou plnohodnotné objekty - Byte, Short, Integer, Long, Float, Double, Boolean, Character

Pokročilé datové struktury

  • Java poskytuje množství datových struktur (objektů), které ulehčují základní operace nad základními datovými strukturami (přidávání, odebírání, procházení atd.)
  • Datové struktury jsou typované - při deklaraci se definuje jaký typ objektu bude v datové struktuře uložen, tzn. jakého typu budou jednotlivé položky. Položka může být opět datová struktura a tím mohou vznikat vícerozměrné datové struktury.
  • LinkedList reprezentuje spojový seznam (seznam položek spojených ukazateli) položek (objektů). Na začátku není třeba definovat velikost - přidáním nové položky se jen přidá ukazatel (link) na nový prvek. Procházení spojového seznamu je sekvenční. Lze přistupovat přímo na prostřední prvky, ale implementace musí projít celý seznam od začátku až po hledaný prvek. Odebírání prvku probíhá efektivně v konstatním čase.

Ukázka metod pro LinkedList

  • ArrayList reprezentuje datovou strukturu pole. U ArrayListu není třeba definovat velikost (možné to ale je), Java vytvoří defaultní velikost a pokud velikost pole nestačí, tak ho automaticky zvětší na dvojnásobek. To může vést ke zbytečné alokaci velkého množství paměti. ArrayList se dá procházet sekvečně, ale dá se také přímo přistupovat na konkrétní prvek jeho indexem v poli. Odebírání prvku je neefektivní, protože po odebrání prvku je nutné zbytek pole posunout.

Ukázka metod pro ArrayList

  • HashMap reprezentuje hashovací tabulku. Hashovací tabulka je seznam dvojic, která přiřazuje zvolenému klíči danou hodnotu. Klíč musí být v rámci tabulky unikátní. HashMap umožňuje přimý přístup (v konstaním čase) k hodnotě pomocí klíče. Tzn. že se můžeme zeptat jaká je přiřazená hodnota danému klíči a HashMap v konstatním čase vrátí hodnotu nebo oznámí, že klíč není v tabulce. HashMap lze procházet sekvenčně, ale není garantováno pořadí prvků.

Ukázka metod pro HashMap

  • LinkedHashMap je rozšířením struktury HashMap o ukazatele mezi jednotlivými prvky (podobně jako u LinkedListu). Umožňuje snadnější průchod tabulkou podle pořadí vkládání prvků.

Ukázka metod pro LinkedHashMap

Iterátor

  • Konstrukce Javy, která umožňuje snadné procházení kolekcemi - např. LinkedList, ArrayList, LinkedHashMap, Set
  • Postupně prochází danou kolekci a v každé iteraci vrací jeden prvek
  • jednoduchý iterátor foreach - snadné použití, nelze mazat položky, daný průchod od začátku do konce

Ukázka použití iterátoru

  • komplexní iterátor - univerzálnější použití, lze mazat položky, možnost definice vlastního průchodu

Ukázka použití komplexního iterátoru

Reversi

Třetí semestrální úlohou RPH bude naprogramování hráče pro hru Reversi.

Začneme postupně od začátku a to krokem 1.

Hádanka

courses/a4b99rph/cviceni/program_po_tydnech/tyden_09.txt · Last modified: 2015/11/27 10:37 by xposik