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 a hashCode pre objekty triedy Zlomok (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ódu pripocitaj, 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 triedu java.lang.Number
  • Upravte triedu Zlomok tak, aby implementovala rozhranie Comparable. Vyskúšajte utriediť zlomky pomocou statickej metódy Collections.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ódou roundValue. 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ť rozhranie Comparator<Zlomok>. Zlomky nech sú zoradené podľa vzdialenosti od 1/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 od 1/2: [3.5, 0.5, 0.25]. Využite triedu PorovnavacZlomkov na utriedenie zoznamu zlomkov a tiež ako parameter v konštruktore triedy TreeSet.

Algoritmy so zlomkami

Vytvorte triedu sk.upjs.Zlomkar, ktorá bude poskytovať základné algoritmy na prácu so zlomkami.

  • Do triedy Zlomkar pridajte metódu sucet, ktorá vráti súčet zlomkov v zozname zlomkov:

1
public Zlomok sucet(List<Zlomok> zlomky)
  • Do triedy Zlomkar pridajte metódu maximum, ktorá vráti najväčšiu hodnotu v zozname zlomkov (porozmýšľajte, ako využiť metódu Collections.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() a getPocetPorovnani())

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 bod b1 je k nejakému bodu [x, y] bližšie ako bod b2)
  • Vytvorte triedu sk.upjs.ReverznyBodovyPorovnavac, ktorá bude implementovať rozhranie Comparator<Bod> a v rámci konštruktora dostane referenciu na nejaký Comparator. Reverzný porovnávač pri metóde compare 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
public static Tvar vytvorTvar(String popis)

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.