Table of Contents

Domácí úkol 4

Tento domácí úkol se dotkne témat: funkcionální programování, lambda funkce, map reduce, funkce vyššího řádu a promise v Javě.

Úvod

V tomto úkolu se zaměříme na české prezidentské volby. Konkrétně nás budou zajímat její výsledky a zajímavé statistiky z nich plynoucí. Vaším úkolem bude tedy vzít otevřená data Českého statistického úřadu a z těchto dat vytěžit zajímavé statistiky.

Zdroje datových sad (nemusíte stahovat, jsou již obsažena v šabloně):

Zadání

Zadání úkolu se od minulých let liší - pokud nahrajete historické řešení, nebude fungovat!

Stáhněte si šablonu pro 4. domácí úkol. Najdete zde 4 datové sady (1. kolo 2018, 2. kolo 2018, 1. kolo 2023 a 2. kolo 2023) výsledků českých prezidentských voleb. Dále zde najdete již hotové načítání datové sady, její parsování a mapování do připraveného objektového modelu a šablony tříd pro výpočet statistik. Vaším úkolem je doplnit všechny metody, které obsahují pouze komentář TODO Homework místo reálné implementace.

Neupravujte jiné třídy než ty, ve kterých je právě komentář TODO Homework.

Účel všech metod by měl být z názvu poměrně jasný; v interfacu daných tříd však můžete nalézt dodatečné informace o každé z nich, a jak přesně by měla fungovat.

Abyste si mohli správnost Vašeho řešení průběžně kontrolovat, najdete zde několik unit testů. Ty jsou dělané vůči 2. kolu voleb z roku 2023. Dále můžete využit třídu Main, ve které najdete několik výpisů statistik. Ty pak můžete porovnat vůči surovým datům nebo se jen tak kochat Vašimi statistikami.

Aby to nebylo zas tak jednoduché a doopravdy jste si vyzkoušeli funkcionální prvky v Javě, je v celém úkolu zakázáno používat cykly a podmíněné bloky! Jejich použití je žádoucí nahradit pomocí StreamAPI, lambda funkcí, referencí metod, Optional a funkcí vyššího řádu. Dále je možné v celém kódu deklarovat maximálně 5 pomocných proměnných. Pomocné private metody zakázané nejsou.

Datová sada

Každá datová sada se skládá z 16 xml souborů. Prvních 14 se jmenují vždy CZ0xx.xml (kód NUTS). Tyto soubory obsahují výsledky voleb z jednotlivých krajů ČR a jejich obcí. Dále zde najdete soubor kandidati.xml, který obsahuje data o kandidátech na post prezidenta české republiky. Posledním souborem je zahranici.xml, který obsahuje výsledky hlasování na zastupitelských úřadech v zahraničí.

Datovou sadu nemusíte nijak parsovat. Toto je již implementované v šabloně úkolu za pomocí knihovny JAXB. Pokud by Vás to zajímalo, najdete to ve třídě OfflineDataLoader. Třídy datového modelu pro Váš úkol najdete v package cz.cvut.fel.omo.hw.functions.data.model. Ovšem jeden háček v parsování tu přecejen je. Data nedostanete přímo, ale zabalená jako CompletableFuture (implementace Promise patternu v Javě). To nám dovoluje například v budoucnu implementovat OnlineDataLoader, který bude asynchroně stahovat datové sady.

Nezapomínejte, že do celkových statistik musíte započítat nejenom výsledky krajů, ale i hlasování na zastupitelských úřadech v zahraničí!
V některých městech v některých datových sadách došlo k remíze mezi kandidáty. Remíza v takovém městě se považuje jako vítězství pro všechny remizující kandidáty.

Odevzdání

Vaše řešení odevzdávejte přes odevzdávací systém BRUTE. Odevzdejte pouze třídy AbroadStatisticsImpl, CandidateStatisticsImpl, ElectionStatisticsImpl, NationalStatisticsImpl, CandidateUtilsImpl. Dále můžete přibalit třídy CompletableFutureUtils a ElectionsUtilsImpl, pokud jste je doimplementovali a využili. Všechny třídy, které odevzdáváte nahrajte v ZIP archivu.

Všechny nahrávané třídy musí být v původním package. Nepřesouvejte tedy nijak třídy, nepřejmenovávejte a neměňte jejich konstruktor.
Pokud nepovinné třídy nevyužijete, ale necháte je v importech, Váš kód nepůjde zkompilovat!
Vaše řešení nebude testováno jen proti veřejně dostupným datům, ale i proti datům smyšlených voleb!