====== 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ě): - Prezidentské volby 2023 [[https://www.volby.cz/opendata/prez2023nss/prez2023nss_opendata.htm]] - Prezidentské volby 2018 [[https://www.volby.cz/opendata/prez2018/prez2018_opendata.htm]] - Prezidentské volby 2013 [[https://www.volby.cz/opendata/prez2013/prez2013_opendata.htm]] ===== Zadání ===== Zadání úkolu se od minulých let liší - pokud nahrajete historické řešení, nebude fungovat! {{ courses:b6b36omo:hw:hw04_template.zip | Šablona 4. domácího úkolu}} 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 [[https://www.volby.cz/opendata/prez2023nss/PREZ_nuts.htm|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 [[https://cw.felk.cvut.cz/brute/|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!