Úkol 5 - použití kontejnerů

Obecný popis situace

Máme školu, kterou navštěvují studenti. Ve škole se vyučují různé předměty. Každý student má přiděleno své jedinečné id a má jméno. Každý předmět má jedinečný název. Studenti si mohou předměty libovolně zapisovat.

Formální zadání

Vaším úkolem je naprogramovat výše uvedené. Budete implementovat tři třídy – Student, Predmet a Skola , které umístíte do balíčku cz.muni.login.skola

Student

Tato třída bude obsahovat proměnnou s celým jménem (tj. pouze jednu) a celočíselnou proměnnou s jedinečným id, které se bude přidělovat od 0 výše automaticky v konstruktoru této třídy. Každý nový student bude tedy mít id o jedno vyšší, než student předchozí. Přidělování id je z vnějšku třídy nepozorovatelné! Třída bude obsahovat pouze jeden veřejný konstruktor s jedním parametrem, kterým bude jméno.

Je tedy nutné zabránit tomu, aby bylo možné vytvořit instanci této třídy konstruktorem bez parametrů. Uvědomte si, že pokud takový konstruktor nedeklarujeme, kompilátor má za to, že tam je a je možné jej tedy použít. Tomu se chceme vyhnout.Omlouvám se za mystifikaci, skrývání konstruktoru bez parametrů není v případě, kdy je deklarován jiný konstruktor, nutné. Implicitní konstruktor překladač vytváří pouze v případě, že není žádný jiný definovaný - pozn. autor.

Třída bude implementovat rozhraní java.lang.Comparable, porovnávanou veličinou bude id. Dále se předefinují metody equals(Object o) a hashCode() třídy Object, přičemž jedinou využívanou veličinou v nich bude opět id. Pozorně si nastudujte vlastnosti těchto metod z dokumentace. Také předefinujte metodu toString(), která bude vypisovat řetězec podle vzoru id jméno.

Navíc implementujte metody getJmeno() a getId(), jejichž funkčnost je zřejmá.

Predmet

Bude obsahovat jedinou proměnnou nazev. Opět chceme jediný konstruktor, který bude mít za parametr název předmětu a nechceme, aby byl veřejně k disposici konstruktor bez parametrů.

Implementujte rovněž metodu toString(), vracející pouze název předmětu (podle vzoru předmět) a metody equals(Object o) a hashCode(). K funkčnosti těchto metod využijte proměnné nazev. Uvědomte si, že řetězce nelze porovnávat jako čísla. Zařiďte, aby obě jmenované metody byly nezávislé na velikosti písmen v názvu, tj. předměty Matematika i MATEMATIKA musejí mít stejný hashcode a musejí se rovnat.

Dále implementujte metodu getNazev(), jejíž funkčnost je zřejmá

Skola

Budou zde čtyři veličiny, které bude nutné si pamatovat:

Třída bude mít pouze jeden konstruktor bez parametrů.

Metody

Do školy ještě vložte metodu main (nejlépe copy a paste z následujícího kódu).


  public static void main(String ... args) {
    Student josef = new Student("Josef Novak");
    Student martin = new Student("Martin Stary");
    Student alice = new Student("Alice Opustena");
    Student anna = new Student("Anna Vdana");
    
    Predmet matika = new Predmet("Matematika");
    Predmet java = new Predmet("Java");
    Predmet informatika = new Predmet("Informatika");
    Predmet algebra = new Predmet("Algebra");
    Predmet slozitost = new Predmet("Slozitost");

    Skola skola = new Skola();
    skola.zapis(alice, matika, java, slozitost);
    skola.zapis(josef, matika, informatika);
    skola.zapis(anna);
    skola.zapis(martin, matika, java, informatika, slozitost);

    skola.vypisStudenty();
    System.out.println(".....");
    skola.vypisPredmety();
    System.out.println(".....");
    skola.vypisPredmetyStudenta(josef);
    skola.vypisPredmetyStudenta(martin);
    skola.vypisPredmetyStudenta(alice);
    skola.vypisPredmetyStudenta(anna);
    skola.vypisPredmetyStudenta(new Student("Frantisek Josef"));
    System.out.println(".....");
    skola.vypisStudentyKPredmetu(matika);
    skola.vypisStudentyKPredmetu(java);
    skola.vypisStudentyKPredmetu(informatika);
    skola.pridejPredmet(algebra);
    skola.vypisStudentyKPredmetu(algebra);
    skola.vypisStudentyKPredmetu(new Predmet("SLOZITOST"));
    skola.vypisStudentyKPredmetu(new Predmet("Programovani"));
  }
  

V případě, že jste vše správně naprogramovali, měli byste dostat výstup podobný tomuto:


0 Josef Novak
1 Martin Stary
2 Alice Opustena
3 Anna Vdana
.....
Java
Slozitost
Informatika
Matematika
.....
0 Josef Novak - Informatika Matematika
1 Martin Stary - Java Slozitost Informatika Matematika
2 Alice Opustena - Java Slozitost Matematika
3 Anna Vdana - nema zapsany zadne predmety
4 Frantisek Josef - neni zapsan
.....
Matematika - 0 Josef Novak 1 Martin Stary 2 Alice Opustena
Java - 1 Martin Stary 2 Alice Opustena
Informatika - 0 Josef Novak 1 Martin Stary
Algebra - nema zadne studenty
SLOZITOST - 1 Martin Stary 2 Alice Opustena
Programovani - neni vyucovan