====== 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: - 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í ===== {{ courses:b6b36omo:hw:042023:homework_functions_task.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. 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. Neupravujte jiné třídy než ty, ve kterých je právě komentář ''%%TODO Homework%%''. Aby to nebylo zas tak jednoduché a doopravdy jste si vyzkoušeli funkcionální prvky v Javě, je v celém úkolu zakázané používat cykly a podmíněné bloky. Naopak žádoucí a povinné je použití StreamAPI, lambda funkcí, referencí metod, Optional a funkcí vyššího řádu. Dále omezte deklarace proměnných a zaměřujte se hlavně na funkce. Pomocné private metody zakázané nejsou. **Zakázané** je použití cyklů (**for, for-each, while, do-while**) a podmíněných bloků (**if, if-else, switch**) v celém úkolu. Doporučuji použít StreamAPI, Optional, lambda funkce, reference na metody a funkce vyššího řádu. Deklaraci proměnných omezte a použijte místo toho pomocnou private metodu. ==== 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 necá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!