14.4.1. Typický prvek kolekce pro české řazení



Podobné dokumenty
Java - řazení objektů

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

typová konverze typová inference

Java a XML. 10/26/09 1/7 Java a XML

20. Projekt Domácí mediotéka

Vytváření a použití knihoven tříd

1. Téma 12 - Textové soubory a výjimky

11. Dědičnost. Dědičnost strana 103

OOPR_05. Případové studie

Programování v Javě I. Únor 2009

Programování v Javě I. Leden 2008

Projekty pro výuku programování v jazyce Java

Seminář Java IV p.1/38

boolean hasnext() Object next() void remove() Kolekce

Java Výjimky Java, zimní semestr

Abstraktní datové typy: zásobník

Java efektivně. Lukáš Zapletal liberix.cz. Pokročilejší techniky programování v Javě

7. Dynamické datové struktury

Algoritmizace a programování

KTE / ZPE Informační technologie

Principy objektově orientovaného programování

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Úvod do programovacích jazyků (Java)

Java Enum Java, zimní semestr ,2017 1

Abstraktní třída a rozhraní

Java Řetězce Java, zimní semestr

Třídy a objekty -příklady

Java - výjimky. private void vstup() throws IOException {... }

Návrhové vzory Tvorba objektů

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Datové struktury. alg12 1

PREPROCESOR POKRAČOVÁNÍ

Teoretické minimum z PJV

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

8. přednáška: Soubory a proudy

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

9. přednáška - třídy, objekty

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Generické programování

Vláknové programování část V

Třídy a dědičnost. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015. poslední přednáška a materiál k samostudiu

Postřehová hra. Zadání projektu. 1 Moje cíle

Regulární výrazy. Vzory

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Textové soubory. alg9 1

Iterator & for cyklus

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Java a Caché IV: Manipulace s objekty

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Výčtový typ strana 67

5 Rekurze a zásobník. Rekurzivní volání metody

7. Datové typy v Javě

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

PŘETĚŽOVÁNÍ OPERÁTORŮ

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Návrhové vzory Design Patterns

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Přehled probírané látky

X-komponenty 3.1. Uživatelská příručka. J. Kocman, V. Trojan

JSR tutorial 2 Transformace v JSR-184

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Seminář Java II p.1/43

Datové struktury strana 81

RMI Remote Method Invocation

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Soubor jako posloupnost bytů

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

OOPR_05. Případové studie

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Dědičnost (inheritance)

JAVA. Krátke poznámky:

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Seminář Java V p.1/49

Semin aˇr Java X Radek Koˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2011 Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady...

6. PRÁCE S DATOVÝMI PROUDY

Design time - vytváří se program - metadata - vytváří se např. třída. Run time - běh programu - ukládá se do paměti počítače - vytváří se např.

3. Třídy. Základní pojmy objektového programování. Třídy

Výjimky. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Programování v jazyku Java hierarchie tříd, přetypování, výjimky

Objektově orientované programování

Reflexe_03. Používání dynamického proxy

1. Programování proti rozhraní

Testy z Javy verze 1.0 Stránka 1 z 13

Z. Kotala, P. Toman: Java ( Obsah )

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

KTE / ZPE Informační technologie

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Distribuované systémy a výpočty

Zápis programu v jazyce C#

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

4IT101 otázky k závěrečnému testu verze pro zimní semestr 2007/2008

JAVA V Assertions Java, zimní semestr

Transkript:

14.4. Co všechno by měl mít typický prvek kolekce 177 Poznámka: Třídy BigInteger, BigDecimal a Date budou vysvětleny v částech [15./183, [16./185 a [18.1./204. 14.4.1. Typický prvek kolekce pro české řazení Předchozí příklad byl ukázkou, co by měl obsahovat prvek kolekce obecně. V následujícím příkladu, který bude předchozí příklad rozvíjet, se pokusíme typický prvek kolekce ještě dvěma způsoby vylepšit. První vylepšení bude spočívat v tom, že řazení jmen umožníme podle pravidel českého řazení (zjednodušeně s ohledem na akcenty podrobně viz [UJJ2/287). Druhé vylepšení se týká užitečného přídavku třídy komparátorů. Má-li totiž třída více atributů, podle kterých lze objekty této třídy řadit, je velmi vhodné připravit i vnitřní třídy příslušných komparátorů. Tento postup již byl podrobně vysvětlen v [1.2.4./29. Samozřejmě je vhodné zachovat i možnost přirozeného řazení. Příklad: Třída OsobaProKolekce bude mít čtyři atributy. Dva z nich budou neměnné řetězce ve významu křestního jména a příjmení. Podle těchto atributů bude také probíhat přirozené řazení. Další dva atributy budou výška a váha. Tyto atributy lze měnit příslušnými metodami set...(). Pro řazení podle nich jsou ve třídě připraveny statické vnitřní třídy komparátorů, takže uživatel třídy nemá s případným řazením podle jakéhokoliv atributu žádné další starosti. Pro řazení podle jména (tj. příjmení a v případě shody i křestního jména) se používá statický atribut COL, který je nastaven pro českou lokalitu. Hodnoty všech atributů jsou kontrolovány a v případě nevhodných hodnot jsou vyhazovány asynchronní (nekontrolované) výjimky NullPointerException pro nezadané křestní jméno a příjmení nebo Illegal- ArgumentException pro nulové či záporné hodnoty výšky a váhy. Za zmínku stojí ještě komparátor PODLE_VAHY, ve kterém se poměrně složitě (ale bezpečně) porovnávají dvě čísla typu double. Je použito porovnávání atributů longvaha na rovnost a atributů vaha na větší/menší. Pokud by bylo zaručeno (což v případě váhy osoby lze předpokládat), že jednotlivé váhy nebudou rozdílné s nepatrnou odchylkou, pak lze místo složitého porovnání využít zakomentovaný rozdíl obou vah. Ve výpisu si všimněte, že písmeno Ch je řazeno správně za Č.

178 Kapitola 14. Jak připravit ideální třídu pro uložení do kolekcí V poslední řádce výpisu je vidět, jak zafunguje ochrana před nepovolenou hodnotou atributu. Protože se jedná o použití výjimky odvozené od typu RuntimeException, nebylo tuto výjimku nikde třeba ošetřovat pomocí try-catch nebo deklarovat pomocí throws. import java.util.*; import java.io.*; import java.text.*; class OsobaProKolekce implements Comparable { // základní stavové atributy // neměnitelné private final String krestni, prijmeni; // měnitelné private int vyska; private double vaha; // odvozený atribut bitový obraz váhy pro hashcode() a equals() protected long longvaha; // pomocný atribut pro české řazení private static final Collator COL = Collator.getInstance(new Locale("cs", "CZ")); public OsobaProKolekce(String krestni, String prijmeni, int vyska, double vaha) { if (krestni == null prijmeni == null) throw new NullPointerException(); this.krestni = krestni; this.prijmeni = prijmeni; setvyska(vyska); setvaha(vaha); public String getkrestni() { return krestni; public String getprijmeni() { return prijmeni; public void setvyska(int vyska) { if (vyska <= 0) throw new IllegalArgumentException("vyska=" + vyska); this.vyska = vyska;

14.4. Co všechno by měl mít typický prvek kolekce 179 public void setvaha(double vaha) { if (vaha <= 0) throw new IllegalArgumentException("vaha=" + vaha); this.vaha = vaha; this.longvaha = Double.doubleToLongBits(this.vaha); public int getvyska() { return vyska; public double getvaha() { return vaha; public String tostring() { return prijmeni + " " + krestni + ", " + vyska + ", " + vaha + "\n"; public boolean equals(object o) { if (o == this) return true; if ((o instanceof OsobaProKolekce) == false) return false; OsobaProKolekce opk = (OsobaProKolekce) o; boolean stejnekrestni = krestni.equals(opk.krestni); boolean stejneprijmeni = prijmeni.equals(opk.prijmeni); boolean stejnavyska = vyska == opk.vyska; boolean stejnavaha = longvaha == opk.longvaha; return stejnekrestni && stejneprijmeni && stejnavyska && stejnavaha; public int hashcode() { int vysledek = 17; vysledek = 37 * vysledek + krestni.hashcode(); vysledek = 37 * vysledek + prijmeni.hashcode(); vysledek = 37 * vysledek + vyska; int pom = (int) (longvaha ^ (longvaha >>> 32)); vysledek = 37 * vysledek + pom; return vysledek;

180 Kapitola 14. Jak připravit ideální třídu pro uložení do kolekcí // přirozené řazení public int compareto(object o) { OsobaProKolekce opk = (OsobaProKolekce) o; int tmpp = COL.compare(this.prijmeni, opk.prijmeni); int tmpk = COL.compare(this.krestni, opk.krestni); return (tmpp == 0? tmpk : tmpp); // komparátory pro absolutní řazení public static final Comparator PODLE_VYSKY = new Comparator() { public int compare(object o1, Object o2) { return ((OsobaProKolekce) o1).vyska - ((OsobaProKolekce) o2).vyska; ; public static final Comparator PODLE_VAHY = new Comparator() { public int compare(object o1, Object o2) { double v1 = ((OsobaProKolekce) o1).vaha; double v2 = ((OsobaProKolekce) o2).vaha; long lv1 = ((OsobaProKolekce) o1).longvaha; long lv2 = ((OsobaProKolekce) o2).longvaha; if (lv1 == lv2) return 0; if (v1 > v2) return +1; else return -1; // return (int) (((OsobaProKolekce) o1).vaha - // ((OsobaProKolekce) o2).vaha); ; public static final Comparator PODLE_JMENA = new Comparator() { public int compare(object o1, Object o2) { OsobaProKolekce opk1 = (OsobaProKolekce) o1; OsobaProKolekce opk2 = (OsobaProKolekce) o2; int tmpp = COL.compare(opk1.prijmeni, opk2.prijmeni);

14.4. Co všechno by měl mít typický prvek kolekce 181 ; int tmpk = COL.compare(opk1.krestni, opk2.krestni); return (tmpp == 0? tmpk : tmpp); public class TestOsobaProKolekce { public static void main(string[ argv) throws IOException { OutputStreamWriter o = new OutputStreamWriter(System.out, "Cp852"); PrintWriter p = new PrintWriter(o); ArrayList a = new ArrayList(); a.add(new OsobaProKolekce("Karel","Chytrý",160,60.)); a.add(new OsobaProKolekce("Karel","Čtvrtý",170,70.)); a.add(new OsobaProKolekce("Karel","Ctvrtý",180,80.)); a.add(new OsobaProKolekce("Josef","Čtvrtý",190,65.)); a.add(new OsobaProKolekce("Kárel","Čtvrtý",200,90.)); p.println(a); Collections.sort(a); p.println("podle jména\n" + a); Collections.sort(a, OsobaProKolekce.PODLE_VYSKY); p.println("podle výšky\n" + a); Collections.sort(a, OsobaProKolekce.PODLE_VAHY); p.println("podle váhy\n" + a); Collections.sort(a, OsobaProKolekce.PODLE_JMENA); p.println("podle jména\n" + a); p.flush(); a.add(new OsobaProKolekce("Jan", "Záporný", 0, -5.)); Poznámka: Aby byly jednotlivé sloupečky atributů zarovnány pod sebou, doplnil jsem do výpisu jednu mezeru za otevírací hranatou závorku. Například původní první řádka výpisu vypadá na obrazovce takto: [Chytrý Karel, 160, 60.0

182 Kapitola 14. Jak připravit ideální třídu pro uložení do kolekcí Vypíše: [ Chytrý Karel, 160, 60.0, Ctvrtý Karel, 180, 80.0 Podle jména [ Ctvrtý Karel, 180, 80.0, Chytrý Karel, 160, 60.0 Podle výšky [ Chytrý Karel, 160, 60.0, Ctvrtý Karel, 180, 80.0 Podle váhy [ Chytrý Karel, 160, 60.0, Ctvrtý Karel, 180, 80.0 Podle jména [ Ctvrtý Karel, 180, 80.0, Chytrý Karel, 160, 60.0 Exception in thread "main" java.lang.illegalargumentexception: vyska=0...