Cvičenie 12 – Modifikátory, rozhrania, usporadúvanie
Cieľom cvičení je pozrieť sa na praktické využitie rozhraní, abstraktných tried a metód a modifikátorov viditeľnosti.
Zlomky
Vytvorte triedu sk.upjs.umv.Zlomok, ktorá reprezentuje zlomok (dvojicu čitateľ a menovateľ). Podobne ako u objektov triedy String, aj obsah objektu triedy Zlomok nech je určený pri jeho vytvorení.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public class Zlomok {
// ???
public Zlomok(int citatel, int menovatel) {
// ???
}
public int getCitatel() {
// ???
}
public int getMenovatel() {
// ???
}
}
- Vhodne implementujte metódy
toString,equalsahashCodepre objekty triedyZlomok(nezabudnite, že zlomok 1/2 a 2/4 reprezentujú ten istý zlomok).
- Vyskúšajte implementáciu predchádzajúcich troch metód na množine zlomkov.
- Do triedy
Zlomokpridajte metódupripocitaj, ktorá vráti zlomok, ktorý vznikne pripočítaním parametrom zadaného zlomku k danému zlomku:
1 public Zlomok pripocitaj(Zlomok z)
Analogické metódy vytvorte aj pre ďalšie matematické operácie.
- Vytvorte metódu, ktorá vráti normalizovaný zlomok (menovateľ je nezáporný a nenulový, čitateľ a menovateľ sú vykrátené):
1 public Zlomok normalizuj()
- Upravte triedu
Zlomoktak, aby rozširovala triedujava.lang.Number
- Upravte triedu
Zlomoktak, aby implementovala rozhranieComparable. Vyskúšajte utriediť zlomky pomocou statickej metódyCollections.sort().
- Pridajte do triedy
Zlomokstatickú metódu, ktorá spočíta súčet zlomkov.
1 public static Zlomok sucet(List<Zlomok> zlomky)
- Pridajte do triedy
Zlomokzlomkovú konštantu, ktorá bude reprezentovať jednu polovicu:
1
2
3
4
5 List<Zlomok> zoznam = new ArrayList<Zlomok>();
for (int i=0; i<10; i++)
zoznam.add(Zlomok.POLOVICA);
System.out.println(Zlomok.sucet(zoznam));
- Vytvorte si vlastné rozhranie
Roundables metódouroundValue. Každá trieda implementujúca tento interface bude schopná vrátiť zaokrúhlenú hodnotu. Pre triedu zlomok metódu implementujte tak, aby vrátila hodnotu zlomku po zaokrúhlení.
- Vytvorte triedu
PorovnavacZlomkov, ktorá bude implementovať rozhranieComparator<Zlomok>. Zlomky nech sú zoradené podľa vzdialenosti od1/2od najväčšej po najmenšiu. Príklad:[3/4, 0/1, 8/2]->[8/2, 0/1, 3/4], príslušné vzdialenosti od1/2:[3.5, 0.5, 0.25]. Využite trieduPorovnavacZlomkovna utriedenie zoznamu zlomkov a tiež ako parameter v konštruktore triedyTreeSet.
Algoritmy so zlomkami
Vytvorte triedu sk.upjs.Zlomkar, ktorá bude poskytovať základné algoritmy na prácu so zlomkami.
- Do triedy
Zlomkarpridajte metódusucet, ktorá vráti súčet zlomkov v zozname zlomkov:
1 public Zlomok sucet(List<Zlomok> zlomky)
- Do triedy
Zlomkarpridajte metódumaximum, ktorá vráti najväčšiu hodnotu v zozname zlomkov (porozmýšľajte, ako využiť metóduCollections.max).
1 public Zlomok maximum(List<Zlomok> zlomky)
Abstraktné metódy a triedy
- Diskutujte, ktoré z metód a tried z predchádzajúcich cvičení (napr. v projekte
PlochaTvarov) by mali byť zmenené na abstraktné a prečo. - Prediskutujte vzťah abstraktných metód a abstraktných tried a nasledovné „pravidlá“ na ľahké zapamätanie si použitia slovíčka
abstract:- abstraktná metóda je metóda bez implementácie – tela (na čo sa to využíva?)
- abstraktná trieda je trieda, ktorej inštanciu nemožno vytvoriť (na čo sa to využíva?)
- ak trieda obsahuje aspoň jednu abstraktnú metódu, potom musí byť abstraktná
Body a polárny súradnicový systém
Vytvorte (alebo spomeňte si) triedu Bod, ktorá uchováva súradnice nejakého bodu (double x, double y). Metóda nech má jeden konštruktor: public Bod(double x, double y). Okrem karteziánskeho súradnicového systému však existuje aj tzv. polárny súradnicový systém. V ňom je poloha bodu určená 2 parametrami:
- jeho vzdialenosťou od stredu súradnicového systému
- uhlom, ktorý zviera polpriamka prechádzajúca stredom súradnicového systému a daným bodom s osou
x.
Navrhnite spôsob, ako pomocou statickej metódy vytvárať objekty triedy Bod na základe určenia jeho súradníc v polárnom súradnicovom systéme. Prediskutujte, či je možné takéto vytváranie bodov realizovať preťažením konštruktorov.
1 public static Bod zPolarnych(double r, double u)
Využitie rozhraní
- Navrhnite a implementujte spôsob, ako možno pomocou komparátorov utriediť reťazce (referencie na objekty triedy
String) v poli nie lexikograficky, ale podľa dĺžky reťazca – v prípade reťazcov rovnakej dĺžky rozhoduje lexikografické porovnanie.- Upravte komparátor tak, aby sa počas triedenia (
Arrays.sort) vypísali dvojice, ktoré sa porovnávajú. - Upravte komparátor tak, aby ste vedeli spočítať, koľko porovnaní zrealizoval komparátor (metódy:
resetujPocitadlo()agetPocetPorovnani())
- Upravte komparátor tak, aby sa počas triedenia (
Rozhrania
Na jednom z predošlých cvičení sme implementovali triedu Bod uchovávajúcu x-ovú a y-ovú súradnicu bodu.
- Navrhnite triedu
sk.upjs.BodovyPorovnavacimplementujúcu porovnávanie bodov podľa vzdialenosti od zadaného bodu (b1 < b2ak bodb1je k nejakému bodu[x, y]bližšie ako bodb2) - Vytvorte triedu
sk.upjs.ReverznyBodovyPorovnavac, ktorá bude implementovať rozhranieComparator<Bod>a v rámci konštruktora dostane referenciu na nejakýComparator. Reverzný porovnávač pri metódecomparebude vracať opačnú hodnotu, ako by vrátil v konštruktore referencovaný komparátor.
Frekvenčná analýza
Pre fajnšmekrov:
- Ako by ste pomocou komparátorov riešili úlohu Frekvenčná analýza z minulého týzdňa? (Utriedenie zoznamu
List<Entry<Character, Integer>>) - Dá sa úloha Frekvenčná analýza riešiť použitím triedy
TreeMapa komparátora? (Odpoveď je záporná, prečo?)
Vlastné rozhrania
- Diskutujte a navrhnite, kde a ako by ste vedeli využiť vlastné rozhrania. Niektorý z príkladov skúste implementovať.
Továreň na tvary
V úlohách venovaných polymorfizmu sme vytvárali triedu Tvar a jej rozšírenia. Vytvorte statickú metódu, ktorá bude na základe reťazca (formát: názov tvaru a medzerami oddelené parametre) vytvárať požadované objekty.
1
Pre fajnšmekrov:
- Ako by ste naprogramovali triedu, ktorej inštancie by bolo možné vytvárať iba cez statickú metódu (cez „továreň“ na objekty)?
Príprava na záverečný test
Vyriešte záverečný test: Farebné body.
