Zadanie 8

Najneskorší termín odovzdania: 14.12.2025 (nedeľa) o 18:00
Odovzdávané súbory: Kid.java, Event.java

Evaluátor je vypnutý. Riešenia môžete odovzdávať v moodle, ale nedostanete feedback, či to funguje. Evaluátor bude spustený najneskôr v pondelok. Všetky riešenia odovzdané pred spustením evaluátora prejdu automaticky procesom evaluácie. V momente, keď bude evaluátor plne funkčný, tento oznam bude odstránený.

Doplňujúce požiadavky:

  • riešenia, ktoré nebude možné skompilovať (t.j. riešenia so syntaktickými chybami) nebudú hodnotené,
  • zdrojový kód správne naformátujte (CTRL+ALT+L),
  • očakáva sa vhodne okomentovaný zdrojový kód
  • v prípade potreby si vytvorte pomocné metódy
  • v tomto zadaní nie je dovolené používať Stream API.

Mikuláš

Firma organizuje mikulášsku párty pre deti zamestnancov. Keďže je vhodné prispôsobiť darčeky a program veku a pohlaviu detí, je potrebné urobiť prehľad o prihlásených deťoch.

Uvažujme triedu Kid, s nasledovnými inštančnými premennými:

  • name – označuje krstné meno dieťaťa (krstné meno v tomto prípade pozostáva iba z jedného slova)
  • age – celočíselné označenie veku dieťaťa
  • isGirl – true pre dievča, false pre chlapca
  • parent – celé meno rodiča dieťaťa

Okrem premenných obsahuje trieda konštruktor, gettre a dvojicu metód equals-hashCode. Triedu nemodifikujte. V prípade potreby si vytvorte metódu toString.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.Objects;

public class Kid {

    private String name;
    private int age;
    private boolean isGirl;
    private String parent;

    public Kid(String name, int age, boolean isGirl, String parent) {
        this.name = name;
        this.age = age;
        this.isGirl = isGirl;
        this.parent = parent;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public boolean isGirl() {
        return isGirl;
    }

    public String getParent() {
        return parent;
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Kid kid = (Kid) o;
        return age == kid.age && isGirl == kid.isGirl && Objects.equals(name, kid.name) && Objects.equals(parent, kid.parent);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, isGirl, parent);
    }
}

Uvažujme triedu Event, ktorá uchováva informáciu o deťoch prihlásených na Mikuláša:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;

public class Event {

    private List<Kid> kids;

    public Event() {
        kids = new ArrayList<>();
    }

    public void add(Kid kid) {
        kids.add(kid);
    }

    public int kidsCount() {
        return kids.size();
    }
}

V zozname sa žiadne dieťa nenachádza viackrát. Poradie detí v zozname nemá striktnú logiku (t.j., deti nie sú zoradené podľa mena, ani iného kritéria).

Môžete predpokladať, že v zozname je aspoň jedno dieťa.


Počet tínedžerov (1 bod)

Metóda vráti celé číslo – počet chlapcov, ktorí majú viac ako 12 rokov.


1
public int numberOfTeenageBoys()

Počet detí (1 bod)

Vráti referenciu na nový objekt implementujúci rozhranie Map, kde kľúčom sú mená zamestnancov a každému zamestnancovi je pridelený počet jeho detí, ktoré sú prihlásené na event.


1
public Map<String, Integer> numberOfKids()

Najmladšie dieťa (1 bod)

Vráti meno najmladšieho dieťaťa zo všetkých. Ak je takých detí viac, vráti ľubovoľné z nich.


1
public String youngestKid()

Vekový rozdiel (1 bod)

Vráti rozdiel medzi najmladším a najstarším dieťaťom. Inak povedané vráti najväčší možný vekový rozdiel medzi ľubovoľnou dvojicou detí.


1
public int ageRange()

Krstné mená (1 bod)

Vráti zoznam všetkých krstných mien detí. Tento zoznam obsahuje každé meno najviac raz.


1
public List<String> uniqueNames()

Zoznam detí zamestnanca (1 bod)

Pre zadaného zamestnanca vráti zoznam jeho detí.


1
public List<Kid> employeeKids(String employee)

Odstráni zamestnanca a jeho deti (1 bod)

Táto metóda odstráni z eventu zamestnanca a všetky jeho deti. Metóda priamo modifikuje zoznam referencovaný inštančnou premennou kids. Metóda vráti počet detí, ktoré boli vymazané z eventu.


1
public int removeEmployeeFromEvent()

Je tam také dieťa? (1 bod)

Metóda vráti, či je na event prihlásené také dieťa, ako je zadané parametrami – meno rodiča, vek dieťaťa a pohlavie.


1
public boolean hasThisKid(String employee, int age, boolean isGirl)

Zamestnanci s viacerými deťmi (1 bod)

Vráti zoznam mien zamestnancov, ktorí majú na evente viac ako jedno dieťa.


1
public List<String> employeesWithMultipleKids()

Najčastejší vek (1 bod)

Vráti vek detí, ktorý je najčastejšie zastúpený. V prípade zhody pre viacero hodnôt veku vráti menšiu hodnotu.


1
public int mostCommonAge()

Chlapci starší ako priemer (1 bod)

Vráti počet chlapcov, ktorí sú starší ako je vekový priemer všetkých detí.


1
public int boysOverAverageAge()

Bonus (1 bod)

Bonus je udelený za vyriešenie všetkých úloh.

Zadanie je inšpirované archívnym finaltermom.