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.
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:
id
)Třída bude mít pouze jeden konstruktor bez parametrů.
Metody
pridejStudenta
- přidá instanci třídy Student
, vrací true
, pokud byl student přidán.pridejPredmet
- přidá instanci třídy Predmte
, vrací true
, pokud byl předmět přidán.zapis
- jako parametry má jednu instanci třídy Student
a proměnný počet (ne pole) instancí třídy Predmet
(proměnný počet parametrů se zadává pomocí tří teček za třídou parametru, viz metoda main níže v tomto dokumentu). Význam metody je takový, že zapíše studenta na vyjmenované předměty. Pokud student nebo předmět nejsou na škole, přidá je tam. Návratová hodnota je void
vypisStudenty
- na standardní výstup vypíše (na každý řádek jednoho) uspořádaný seznam studentů. Návratová hodnota je void
.vypisPredmety
- na standardní výstup vypíše (na každý řádek jeden) seznam předmětů. Návratová hodnota je void
.vypisPredmetyStudenta
- jako parametr má instanci Student
a, a vypíše na jeden řádek předměty, které má zapsány podle následujícího vzoru: vypisStudentyKPredmetu
- jako parametr má instanci Predmet
u, vypíše na jeden řádek předmět a studenty, kteří jej navštěvují podle následujícího vzoru (nyní bez vysvětlivek): 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