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
,equals
ahashCode
pre 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
Zlomok
pridajte 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
Zlomok
tak, aby rozširovala triedujava.lang.Number
- Upravte triedu
Zlomok
tak, aby implementovala rozhranieComparable
. Vyskúšajte utriediť zlomky pomocou statickej metódyCollections.sort()
.
- Pridajte do triedy
Zlomok
statickú metódu, ktorá spočíta súčet zlomkov.
1 public static Zlomok sucet(List<Zlomok> zlomky)
- Pridajte do triedy
Zlomok
zlomkovú 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
Roundable
s 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/2
od 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 trieduPorovnavacZlomkov
na 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
Zlomkar
pridajte metódusucet
, ktorá vráti súčet zlomkov v zozname zlomkov:
1 public Zlomok sucet(List<Zlomok> zlomky)
- Do triedy
Zlomkar
pridajte 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.BodovyPorovnavac
implementujúcu porovnávanie bodov podľa vzdialenosti od zadaného bodu (b1 < b2
ak bodb1
je 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ódecompare
bude 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
TreeMap
a 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.