====== Reversi III ====== * Reversi * diskuse problémů prvního odevzdání * Java tutoriálek * Testík * Hádanka ===== Reversi ===== * Individuální kontrola hráčů ====== Java tutoriálek ====== V této části jsme pro vás sromáždili informace, o kterých si myslíme, že by se vám mohly hodit. ===== Komparátory a další užitečné konstrukce v Javě ===== == Interface == * Java nepodporuje vícenásobnou dědičnost (jedna třída nemůže mít více než jednoho rodiče) -> místo toho rozhraní (interface) * Interface může definovat pouze abstraktní metody (bez těla) nebo konstanty (od Javy 8 přibyly tzv. [[http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/|defaultní metody]]). * Třída může implementovat (pomocí klíčového slova //implements//) i více rozhraní. * Třída musí implementovat všechny metody, jejichž hlavičky jsou v rozhraní. ++++ Příklad | public interface Predator { boolean chasePrey(Prey p); void eatPrey(Prey p); } public interface Prey { void hide(); void run(); } abstract public class Animal { abstract public void talk(); public Position getLocation(){...} } /** Trida implementujici dve interface a dedici od abstraktni tridy */ public class Frog extends Animal implements Predator, Prey { /** nutna definice metod abstraktni tridy */ public void talk(){...} /** nutna definice metod od interface */ public boolean chasePrey(Prey p) {...} public void eatPrey (Prey p) {...} public void hide() {...} public void run() {...} } ++++ * **Abstraktní třída vs. Interface** | ^ Interface ^ Abstraktní třída ^ ^ Dědičnost | Lze implementovat více než jedno //interface// | Třída může rozšiřovat pouze jednu //abstract// třídu | ^ Implementace metod | Žádné metody nemohou být implementovány (od Javy 8 mohou!) | Lze implementovat těla metod neoznačených jako //abstract// | ^ Proměnné | Lze definovat pouze //static final// konstanty | Lze definovat jak konstanty tak členské proměnné | ^ Použití | Většinou definuje spíše vlastnosti třídy než rozšíření vlastností jiné třídy. Např. //Comparable//, //Iterable//, //Runnable// | Definuje příslušnost třídy k super třídě, rozšiřuje její vlastnosti. Např. //List// -> //LinkedList//, //Player// -> //MyPlayer//| ==Vybrané metody třídy Collections == V třídě [[http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html|Collections]] se nacházejí užitečné statické metody pro páci s třídami typu //Set//, //List//, //Map// a třídami od nich odvozenými. > {{page>courses:a4b99rph:internal:cviceni:tyden11#Collections}} * void **copy**(List dest, List src) * zkopíruje všechny prvky ze seznamu //src// (typu T nebo odvozených od T) do seznamu //dest// (typu T nebo nadtřídy T) ++++ příklad | List src = new ArrayList(); src.add("a"); src.add("b"); src.add("c"); List dst = new ArrayList(); dst.add("e"); dst.add("f"); dst.add("g"); Collections.copy(dst,src); System.out.println(dst.toString()); // [a, b, c] ++++ * T **max**(Collection coll) * vrátí maximální prvek ze seznamu. Uvažuje přirozené řazení (tj. buď podle abecedy nebo velikosti) * T **max**(Collection coll, Comparator comp) * vrátí maximální prvek ze seznamu, kde pořadí prvků je definováno třídou //Comparator// * void **reverse**(List list) * obrátí pořadí prvků v listu * void **sort**(List list) * seřadí prvky listu vzestupně podle přirozeného řazení (tj. buď podle abecedy nebo s rostoucí velikostí) * void **sort**(List list, Comparator c) * seřadí prvky listu podle pořadí definovaného třídou //Comparator// == Comparator a Comparable interface == Pro porovnávání dvou prvků a zároveň i definici jejich pořadí v seznamech lze v Javě použít dva přístupy. * **Comparable** objekt je schopen porovnat sám sebe s jiným objektem. Takovýto objekt musí implementovat //Comparable// interface. Konkrétně musí definovat metodu //int compareTo(Object obj)// - ta porovná daný objekt s objektem //obj// a vrátí <0, 0 nebo >0 podle toho, jetli je daný objekt menší, roven nebo větší než //obj//. Implmentací metody //compareTo// definujeme přirozené uspořádání objektů. * **Comparator** je objekt který umožňuje porovnat dva různé objekty. Při jeho implementaci je potřeba přepsat jedinou metodu - //int compare(T o1, T o2)// a to tak, že vrací <0, 0 nebo >0 podle toho, jestli objekt //o1// je menší, roven nebo větší než objekt //o2//. ++++ příklad třídy implementující Comparable | public class Employee implements Comparable { private int empId; private String name; private int age; /** Porovnani podle cisla zamestnance */ public int compareTo(Employee o) { return this.empId - o.empId ; } ... } ++++ ++++ příklad Comparatoru | public class EmpSortByNameComparator implements Comparator{ /** Porovna jmena zamestnancu - String implementuje Comparable, proto lze pouzit compareTo() */ public int compare(Employee o1, Employee o2) { return o1.getName().compareTo(o2.getName()); } } ++++ ++++ použití: | List employees = new ArrayList(); employees.add(new Employee(4, "Tomáš", 28)); employees.add(new Employee(1, "Zdeněk", 19)); employees.add(new Employee(2, "Bořek", 34)); employees.add(new Employee(3, "Adam", 40)); Collections.sort(employees); // natural ordering System.out.println(employees); Collections.sort(employees, new EmpSortByNameComparator()); // defined ordering System.out.println(employees); ++++ ====== Ukázka na práci s datovými strukturami ====== Teď si některé z těchto věcí vyzkoušíte sami. Vaším úkolem bude napsat funkce vyhledávající a třídící automobily v jednoduché databázi. Stáhněte si připravený {{:courses:a4b99rph:cviceni:files:cars.zip|projekt}}, naimportujte si ho do Vašeho IDE a doplňte těla metod ve třídě **CarsDatabase**. Při implementaci se soustřeďte primárně na efektivitu při volání metod get...(). > {{page>courses:a4b99rph:internal:cviceni:tyden11#cars}} ====== Programovací testík ====== [[courses:a4b99rph:internal:kratke_testiky:tyden_10|Zadání]] na interních stránkách. ====== Hadanka ====== > {{page>courses:a4b99rph:internal:cviceni:tyden11#hadanka}}