8. sada domácich zadaní

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

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+SHIFT+F),
  • očakáva sa vhodne okomentovaný zdrojový kód
  • v prípade potreby si vytvorte pomocné metódy

Zoznam Odberov

Počas pandémie je testovanie jedným zo základných diagnostických nástrojov. Aktuálne sú najpoužívanejšie odbery z nosohltanu, ktoré sú analyzované PCR testom alebo antigénovým testom. Aj viacero firiem sa rozhodlo používať testovanie ako nastroj na ochranu svojich zamestnancov. Ale aj nástroje treba používať správne a pomocou kvalitného vyhodnocovania a dátovej analýze vieme získať aj pridanú informáciu, ktorú by sme z jedného testu (odberu) nevedeli získať.

Máme triedu Odber, ktorá reprezentuje informácie z jedného odberu. Naprogramujte triedu ZoznamOdberov, ktorá reprezentuje informácie o odberoch. Bodové hodnotenia jednotlivých metód sú uvedené v komentároch v zdrojovom kóde.

Poznámky:

  • Ak do triedy Odber nepridávate pomocne metódy, tak ju odovzdajte do Moodlu tak ako je na stránke.
  • Pri viacerých úlohách odporúčame rozdeliť funkcionalitu na viacero metód, či už v triede Odber alebo ZoznamOdberov.
  • Metódy a konštruktory, ktoré nemajú napísane bodové hodnotenie nemodifikujte.
  • Niektoré úlohy obsahujú hint, ale je prípustné aj iné korektné riešenie.
  • Jednotlivé odbery nemajú v zozname odberov žiadne chronologické ani lexikografické poradie.
  • Za úspešné vyriešenie aspoň šiestich úloh získavate jeden ďalší bod a za úspešné vyriešenie všetkých úloh získavate opäť ďalší bod.
public class Odber {

        private String menoZamestnanca;
        private String datumOdberu;
        private int odberneMiesto;
        private boolean vysledok;

        public Odber(String menoZamestnanca, String datumOdberu, int odberneMiesto, boolean vysledok) {
                super();
                this.menoZamestnanca = menoZamestnanca;
                this.datumOdberu = datumOdberu;
                this.odberneMiesto = odberneMiesto;
                this.vysledok = vysledok;
        }

        @Override
        public String toString() {
                return menoZamestnanca + ", " + datumOdberu + ", " + odberneMiesto + ", " + vysledok;
        }

        public String getMenoZamestnanca() {
                return menoZamestnanca;
        }

        public String getDatumOdberu() {
                return datumOdberu;
        }

        public int getOdberneMiesto() {
                return odberneMiesto;
        }

        public boolean getVysledok() {
                return vysledok;
        }

        /**
         * Vygenerovana metoda hashCode, metodu neupravujte
         */

        @Override
        public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + ((datumOdberu == null) ? 0 : datumOdberu.hashCode());
                result = prime * result + ((menoZamestnanca == null) ? 0 : menoZamestnanca.hashCode());
                result = prime * result + odberneMiesto;
                result = prime * result + (vysledok ? 1231 : 1237);
                return result;
        }

        /**
         * Vygenerovana metoda equals, ktora zisti, ci objekt triedy odber je rovnaky
         * ako parameterom zadany objekt obj. Metodu neupravujte
         *
         * @param obj porovnavany objekt
         */

        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Odber other = (Odber) obj;
                if (datumOdberu == null) {
                        if (other.datumOdberu != null)
                                return false;
                } else if (!datumOdberu.equals(other.datumOdberu))
                        return false;
                if (menoZamestnanca == null) {
                        if (other.menoZamestnanca != null)
                                return false;
                } else if (!menoZamestnanca.equals(other.menoZamestnanca))
                        return false;
                if (odberneMiesto != other.odberneMiesto)
                        return false;
                if (vysledok != other.vysledok)
                        return false;
                return true;
        }

}
 
import java.util.*;

public class ZoznamOdberov {

        /**
         * List reprezentujuci zoznam odberov
         */

        private List<Odber> odbery;

        /**
         * Konstruktor zoznamu odberov vytvori prazdny ArrayList
         */

        public ZoznamOdberov() {
                odbery = new ArrayList<>();
        }

        /**
         * Pridavanie odberu do list-u
         * @param o
         */

        public void pridaj(Odber o) {
                odbery.add(o);
        }

        /**
         * Metoda vrati, kolko odberov sa vykonalo na odbernom mieste zdanom parametrom
         * @param odberneMiesto cislo odberneho miesta
         * @return pocet odberov, ktore sa vykonali na odbernom mieste odberneMiesto
         */

        public int pocetOdberovNaMieste(int odberneMiesto) {
                // ??? (1 bod)
                return 0;
        }

        /**
         * Metoda vrati zoznam mien pozitivne testovanych. Mena sa nenachadzaju na zozname dupliticne
         * @return zoznam mien pozitivne testovanych, bez duplicit
         */

        public List<String> pozitivneTestovani(){
                // ??? (1 bod)
                // hint: Set
                return null;
        }
        /**
         * Metoda vrati priemerny pocet testovanych za den testovania.
         * Ak testujeme v pondelok 30.11. a piatok 4.12., tak sú to dva dni,
         * pocas ktorych sa testovalo.
         * @return priemerny pocet testovanych za den testovania
         */

        public double priemernyPocetTestovZaDenTestovania() {
                // ??? (1 bod)
                return 0;
        }

        /**
         * Metoda vrati zoznam mien vsetkych testovanych, ktori sa zucastnili odberu v rozmedzi datumov. Mena sa nenachadzaju na zozname dupliticne
         * @param odDatum datum zaciatku, vratane tohto datumu
         * @param doDatum datum konca, vratane tohto datumu
         * @return mena testovanych v rozmedzi datumov
         */

        public List<String> testovaniOdDo(String odDatum, String doDatum){
                // ??? (1 bod)
                // hint: Pre jednoduchost nepouzivajte triedu Date, ale odporucame datumy prerobit na cislo a pracovat s cislami
                // napr. ak je odDatum "30.11.2020" a doDatum "4.12.2020" a zaujima nas, ci "1.12.2020"
                // je medzi tymito datumami, tak ich prerobime na cisla, 20201130, 20201204, 20201201
                // a zistujeme, ci plati 20201130 <= 20201201 a zaroven 20201201 <= 20201204
                // pozn.: ak chcete znak '.' (bodka) zapisat ako delimiter pre scanner alebo v metode split, tak ju zapisujeme ako "\\." lebo ide o specialny znak
                // pozn.: pri vstupe vzdy plati, ze odDatum <= doDatum
                return null;
        }

        /**
         * Metoda vrati mapu, kde je kazdemu menu priradene kolko testov absolvoval
         * @return mapa osob a ich poctu absolvovanych testov
         */

        public Map<String,Integer> pocetTestovOsoby(){
                // ??? (1 bod)
                return null;
        }

        /**
         * Metoda vrati zoznam mien pozitivne testovanych, ktori mali aspon 2 pozitivne testy. Mena sa nenachadzaju na zozname dupliticne.
         * @return zoznam mien tych, ktori boli pozitivne testovani aspon dvakrat, bez duplicity mien
         */

        public List<String> opakovanePozitivny(){
                // ??? (1 bod)
                return null;
        }

        /**
         * Metoda vrati, ci zamestnanec prekonal nakazu. To znamena, ze mal pozitivny test v nejaky den a negativny neskor.
         * @param menoZamestnanca
         * @return
         */

        public boolean prekonalNakazu(String menoZamestnanca) {
                // ??? (1 bod)
                // hint je pri metoda testovanyOdDo
                return false;
        }

        /**
         * Metoda vrati zoznam tych mien z vyberu zamestnancov, ktori este neabsolvovali ziaden odber.
         * @param vyberZamestnancov
         * @return novy zoznam vytvoreny zo zoznamu vyberZamestancov, bez zamestancov, ktori uz absolvovali odber
         */

        public List<String> bezOdberu(List<String> vyberZamestnancov){
                // ??? (1 bod)
                return null;
        }

        /**
         * Metoda vrati zoznam mien zamestnancov, ktori mali pocas toho isteho dna pozitivny aj negativny test. Mena sa nenachadzaju na zozname dupliticne.
         * @return zoznam mien tych, ktori pocas jedneho dna mali pozitivny aj negativny test
         */

        public List<String> podozrivoTestovani(){
                // ??? (1 bod)
                // hint: vyuzite dvojicu menoZamestnanca datumOdberu
                return null;
        }

        /**
         * Metoda vrati cislo odberneho miesta, kde sa vykonalo najviac odberov. Ak je takychto pracovisk viac, tak vrati ktorekolvek z nich.
         * @return cislo pracoviska, ktore vykonalo najviac odberov
         */

        public int najvytazenejsiePracovisko() {
                // ??? (1 bod)
                return 0;
        }

}