From 1dbf0dd118a73bb2b6e0ff04e9fd051880229a36 Mon Sep 17 00:00:00 2001 From: ruslaneskov <32193120+ruslaneskov@users.noreply.github.com> Date: Mon, 7 May 2018 13:36:02 +0300 Subject: [PATCH 1/2] Create 2018EX12.rst --- Solutions/2017/2018EX12.rst | 138 ++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 Solutions/2017/2018EX12.rst diff --git a/Solutions/2017/2018EX12.rst b/Solutions/2017/2018EX12.rst new file mode 100644 index 0000000..020cc45 --- /dev/null +++ b/Solutions/2017/2018EX12.rst @@ -0,0 +1,138 @@ +EX12 +==== +Class Cargo + +Selleks, et mitte luua iga kauba tüübi jaoks eraldi klassi, loome enum`i. + + .. code:: java + + private enum CargoType { + HUMAN, WOOD, WATER, FUEL, FIRE + } +Selleks, et igal kaubal oleks riskitase, kasutan muutujat konsturktori sees ning lähen tsükliga mööda CargoType. Võimalus oleks ka üleval +kuskul teha Map`i, kus key=cargotype ning value=dangerlevel. + .. code:: java + + public Cargo(CargoType cargoType) { + int count = 0; + for (CargoType cargo: Cargo.CargoType.values()) { + count++; + if (cargo == cargoType) { + dangerLevel = count; + break; + } + } + if (count > 3) { + count++; + } + dangerLevel = count; + } + +Class Car + +Siin klassis võiks olla muutuja, mis hoiab enda sees klassi Cargo objekti (või mitte hoiab, juhul kui car on tühi). Kuna car võib tühi olla, +siis peab olema võimalus seda täita kaubaga. Näiteks iga Cargo objekti sees võib olla muutuja, kuhu pannakse sisse kaup. + + .. code:: java + + public String getCargoName() { + if (cargo == null) { + return "EMPTY"; + } else { + return cargo.getName(); + } + } + +Class Engine + +Kuna veduriga peab andma kaasa tema riskitaset, siis peaks juba konstruktoris määrama, et veduri loomisel seda kindlasti annakse kaasa. +Sellele võiks järgneda kontroll selleks, et keegi kogemata ei paneks riskitaseme väärtuseks negatiivse arvu või nulli. + + .. code:: java + + if (riskLevel <= 0) { + risklevel = 1; + } + +Class Train + +Kuna rongil on vedur ja vagunid, siis rongi loomisel peaks andma talle veduri ja vaguneid. +On vaja meeles pidada, et mõned kaubad ei sobi koos vedamiseks, seega on vaja teha kontroll. Näiteks, lisada kõik potentsiaalsed kaubad +listi ja siis kirjutada abimeetod. Kui lugeda hoolikalt läbi kaupade mittesobivused, siis osutub, et õigeid kombinatsioone pole väga +palju. + + .. code:: java + + private boolean cargosAreOk() { + return cargos.size() == 0 || cargos.size() == 1 || cargos.contains("FUEL") + && cargos.contains("WOOD") || cargos.contains("WATER") && cargos.contains("HUMAN") + || cargos.contains("WOOD") && cargos.contains("HUMAN"); + } + +Kui kontroll on tehtud, siis oleks vaadata ka seda, et riskitase ei läheks liiga suureks. Võiks teha listi, kuhu pannakse kõik vagunid, +mille summaarne riskitase oleks väiksem kui vedur võimaldab. + .. code:: java + + int sum = 0; + for (Car car: a) { + if (sum + car.getCargo().getDangerLevel() <= engine.getRiskLevel()) { + trainCars.add(car); + sum += car.getCargo().getDangerLevel(); + } + } + +Class Depot + +Võiks olla list kus hoitakse selle depoo vagunid ning ka selle depoo vedurid. Peab olema võimalus lisada ja eemaldada listidest elementid +(kuna depoosse võib olmuda uus rong või siis vedur). Peamiseks meetodiks depoo klassis on rongi tegemine. Rongide mäletamiseks pärast +rongi tegemist võiks seda lisada listi. Algul peaks tegema kaupade kontrolli (vaata meetodit üleval). + +Siis peaks tegema valuku veduri suhtes. (Mõistlik teha eraldi meetodis) PS. Siin valitakse parimat vedurit (boonus) + + .. code:: java + + if (engineList.size() > 0) { + if (cargoTypes.length == 1 && cargoTypes[0].getDangerLevel() > this.getBestEngine().get() + .getRiskLevel()) { + try { + throw new TooRiskyCargo("Too risky"); + } catch (TooRiskyCargo a) { + System.out.println("Too risky cargo"); + return Optional.empty(); + } + } + int index = 0; + for (int i = 0; i < engineList.size(); i++) { + if (engineList.get(i).getRiskLevel() > engineList.get(index).getRiskLevel()) { + index = i; + } + } + Engine head = engineList.get(index); + engineList.remove(index); + +Nüüd peab panema kaubad vagunitesse ja teha rongi. Alljärgnevas koodis on vaadatud juhtum kus esimeseks vaguniks ei tohi olla fuel +(tehakse Boonust). Vaadake kindlasti üle ka teised juhtumid (kui rongi ei tagastata) ja tagastake tühka Optional`i. Tulemus salvastatakse +rongide listis. + + .. code:: java + + if (riskLevel <= 0) { + risklevel = 1; + } + if (chosenCarsss.size() > 0) { + if (chosenCarsss.get(0).getCargoName().equals("FUEL")) { + return Optional.empty(); + } + Train trainNew = new Train(head, chosenCarsss.toArray(new Car[chosenCarsss.size()])); + trainList.add(trainNew); + return Optional.of(trainNew); + } + +Boonus + +Selles osas on vaja kasutada erindite püüdmist ning ka teha erindeid. Soovitan lugeda sellest siin: +https://ained.ttu.ee/javadoc/Exceptions.html#erindiga-tegelemine-exception-handling +Lisaks sellele on vaja kirjutada testid. Testide kirjutamise kohta saab teada siin (lõpus): +https://ained.ttu.ee/mod/charon/view.php?id=6045 + +Kontroll selleks, et kütus poleks esimeseks kaubaks on realiseeritud ning veduriks valitakse ka parima riskitasemega vedur. From e7367b1beb34e3c497b35469d5a7141bd5e2975e Mon Sep 17 00:00:00 2001 From: ruslaneskov <32193120+ruslaneskov@users.noreply.github.com> Date: Mon, 7 May 2018 22:41:27 +0300 Subject: [PATCH 2/2] Update 2018EX12.rst --- Solutions/2017/2018EX12.rst | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Solutions/2017/2018EX12.rst b/Solutions/2017/2018EX12.rst index 020cc45..915d78d 100644 --- a/Solutions/2017/2018EX12.rst +++ b/Solutions/2017/2018EX12.rst @@ -6,26 +6,26 @@ Selleks, et mitte luua iga kauba tüübi jaoks eraldi klassi, loome enum`i. .. code:: java - private enum CargoType { - HUMAN, WOOD, WATER, FUEL, FIRE + public enum CargoType { + HUMAN(1), WOOD(2), WATER(3), FUEL(4), FIRE(5); + + int dangerLevel; + + CargoType(int value) { + this.dangerLevel = value; + } + } -Selleks, et igal kaubal oleks riskitase, kasutan muutujat konsturktori sees ning lähen tsükliga mööda CargoType. Võimalus oleks ka üleval -kuskul teha Map`i, kus key=cargotype ning value=dangerlevel. +Selleks, et igal kaubal oleks riskitase, kasutan annan igale enumi väärtusele kaasa numbri, mis tähendab riskitaset. + .. code:: java public Cargo(CargoType cargoType) { - int count = 0; - for (CargoType cargo: Cargo.CargoType.values()) { - count++; - if (cargo == cargoType) { - dangerLevel = count; - break; - } - } - if (count > 3) { - count++; - } - dangerLevel = count; + this.name = cargoType; + } + + public int getDangerLevel() { + return name.dangerLevel; } Class Car