Toto cvičení je zaměřeno na základy práce s objekty a jejich metodami. Následuje jejich aplikace ve spojovém seznamu.
cars
, do balíčku cz.cvut.fel.pjv.cars
přidejte třídu Main
obsahující metodu main
- vstupní bod programu.
cz.cvut.fel.pjv.cars.model
vytvořte třídu Car
s následujícími vlastnostmi a zajistěte vhodné zapouzdření:
manufacturer
modelName
year
vinCode
datového typu UUID, při inicializaci generujte novou hodnotu pomocí UUID.randomUUID()
.
toString
, která bude vracet řetězec typu “Volkswagen Polo year 2010 VIN: 38e8a15e-521c-466a-98e0-f78c03fcdb94.”.
getNumberOfExistingCars()
.
equals
a hashcode
. Při zjišťování zda objekty jsou stejné porovnávejte pouze vinCode
.
main
a ověřte výstup programu.
Car car1 = new Car("Volkswagen", "Polo", 2010); System.out.println(car1); System.out.println("Počet aut: " + Car.getNumberOfExistingCars()); Car car2 = new Car("Chevrolet", "Corvette", 1980); System.out.println(car2); System.out.println("Počet aut: " + Car.getNumberOfExistingCars());
Volkswagen Polo year 2010 VIN: 38e8a15e-521c-466a-98e0-f78c03fcdb94. Počet aut: 1 Chevrolet Corvette year 1980 VIN: 38d302ff-e1e1-41b5-b53b-5df1a3add882. Počet aut: 2
Engine
se zapouzdřenou vlastností type
. Implementujte metody equals
, hashcode
a toString
. Pomocí kompozice realizujte vazbu has-a mezi Car
a Engine
, do konstruktoru Car
přidejte řetězec popisující typ motoru jako vstupní parametr.
ServiceBook
obsahující pole řetězců serviceRecords
o interně dané kapacitě. Vytvořte konstruktor ServiceBook(Car car)
, který vytvoří servisní knížku pro dané auto. ServiceBook
přidejte jako další datový atribut do třídy Car
a realizujte obousměrnou vazbu mezi třídami ServiceBook
a Car
. V případě, že auto již servisní knížku má, bude tato přepsána. Situaci by však bylo vhodnější ošetřit pomocí výjimky (naučíte se později).
main
následovně a ověřte výstup programu.
Car car1 = new Car("Volkswagen", "Polo", 2010, "AKK"); ServiceBook serviceBook1 = new ServiceBook(car1); serviceBook1.addRecord("První servisní prohlídka."); System.out.println(car1); System.out.println("Počet aut: " + Car.getNumberOfExistingCars()); System.out.printf("Servisní záznamy %s %s:\n%s\n", car1.getManufacturer(), car1.getModelName(), car1.getServiceBook()); Car car2 = new Car("Chevrolet", "Corvette", 1980, "LS7"); ServiceBook serviceBook2 = new ServiceBook(car2); serviceBook2.addRecord("První servisní prohlídka."); serviceBook2.addRecord("Porucha motoru."); System.out.println(car2); System.out.println("Počet aut: " + Car.getNumberOfExistingCars()); System.out.printf("Servisní záznamy %s %s:\n%s\n", car2.getManufacturer(), car2.getModelName(), car2.getServiceBook());
Volkswagen Polo year 2010 VIN: 5ab16b5f-c504-41f3-ab28-8111c3fb4ab1. Počet aut: 1 Servisní záznamy Volkswagen Polo: První servisní prohlídka. Chevrolet Corvette year 1980 VIN: d18fe38c-dedc-42f3-90b4-0f63b2e40cfa. Počet aut: 2 Servisní záznamy Chevrolet Corvette: První servisní prohlídka. Porucha motoru.
cz.cvut.fel.pjv.cars.data
implementujte třídu TimeSpan
představující časový interval. Třída bude zapouzdřovat časové údaje hour
(kladné celé číslo), minute
(hodnota 0-59) , second
(hodnota 0-59).
(), (second), (minute, second), (hour, minute, second)
a metodu setTime(hour, minute, second)
. V případě chybějících údajů umožněte přepočet na vyšší jednotky, tj. 70 sekund je 1 minuta a 10 sekund. V případě zadání vyššího údaje ošetřete povolený rozsah. Pro 0 minut, 70 sekund bude chybný údaj sekund nastaven na 0 (později vhodné ošetření výjimkou).
equals, hashCode, toString
. Umožněte porovnání instancí této třídy podle celkového času.
getTotalSeconds()
a metodu add(int second)
, která modifikuje danou instanci a vrátí referenci na ni.
main
a ověřte výstup programu.
TimeSpan t1 = new TimeSpan(0, 0, 130); System.out.println("T1: " + t1); t1 = new TimeSpan(130); System.out.println("T1: " + t1); TimeSpan t2 = new TimeSpan(t1).add(70); System.out.println("T1: " + t1); System.out.println("T2: " + t2); System.out.printf("Časy se %s.\n", t1.equals(t2) ? "rovnají" : "nerovnají"); t1 = t1.add(70); System.out.println("T1: " + t1); System.out.println("T2: " + t2); System.out.printf("Časy se %s.\n", t1.equals(t2) ? "rovnají" : "nerovnají");
T1: 0 hours 0 minutes 0 seconds T1: 0 hours 2 minutes 10 seconds T1: 0 hours 2 minutes 10 seconds T2: 0 hours 3 minutes 20 seconds Časy se nerovnají. T1: 0 hours 3 minutes 20 seconds T2: 0 hours 3 minutes 20 seconds Časy se rovnají.
cz.cvut.fel.pjv.cars.data
implementujte třídu RaceResult
. Třída bude reprezentovat dvojici klíč-hodnota, kde klíčem bude auto (Car
) a hodnotou čas jízdy daného auta (TimeSpan
). Umožněte porovnání instancí třídy RaceResult
podle evidovaného času.
cz.cvut.fel.pjv.utils
implementujte třídu ArrayUtil
. Zajistěte, že třídu nebude možné instancovat. Implementujte metodu třídy s názvem sort
, která provede řazení algoritmem Bubble sort nad polem objektů implementujících rozhraní Comparable
, tj. porovnatelných objektů.
Car
přidejte vlastnost speed
udávající rychlost auta.
cz.cvut.fel.pjv.cars.data
implementujte třídy CarListNode
a CarLinkedList
implementující spojový seznam aut. Implementujte metodu toArray()
převádějící spojový seznam na pole o velikosti počtu prvků ve spojovém seznamu.
cz.cvut.fel.pjv.cars
implementujte třídu Race
představující automobilový závod. Závod bude mít jako povinný parametr délku trasy length
. Závod bude mít neomezený počet startovních pozic (využijte spojový seznam). Metodou addRacingCar(Car car)
se přidá vůz na první volnou startovní pozici. Metodá vrátí true
při úspěchu a false
v případě, že závod již odstartoval. Implementujte metody getWinner()
a getWinningTime()
, které vrátí instanci vyhrávajícího auta, resp. čas jeho jízdy. V případě stejných časů bude výhercem jedno z aut. Zajistěte, že výpočet výherce proběhne pouze jednou a bude cachován uvnitř třídy. Využijte pomocnou metodu getRaceResults()
vracející pole RaceResult
(párů auto-čas). Spojový seznam aut nejprve převeďte na pole. Při výpočtu času jízdy předpokládejte zjednodušenou situaci, kdy každé auto se od startu až po cíl (length
) pohybuje konstantní rychlostí speed
.
main
(existující první dva řádky upravte) a ověřte výstup programu.
Car car1 = new Car("Volkswagen", "Polo", 2010, "AKK", 40); Car car2 = new Car("Chevrolet", "Corvette", 1980, "LS7", 45); Car car3 = new Car("Trabant", "P601", 1990, "Air cooled, 0.6-liter 2-stroke", 20); Car car4 = new Car("BMW", "3", 2006, "318d", 42); Car car5 = new Car("McLaren", "F1", 2014, "V12", 107); Race race = new Race(1000); race.addRacingCar(car1); race.addRacingCar(car2); race.addRacingCar(car3); race.addRacingCar(car4); race.addRacingCar(car5); System.out.println("Závodníci:"); System.out.println(race); System.out.printf("Výhercem se stává %s s časem %s.\n", race.getWinner(), race.getWinningTime()); System.out.printf("Pořadí v cíli:\n%s\n", race);
Závodníci: Volkswagen Polo year 2010 VIN: 2b8a89b2-f15d-4a5a-a14e-8de9aca023d8 Chevrolet Corvette year 1980 VIN: 75e880b1-822d-49b5-9b5e-e8cca5f48e99 Trabant P601 year 1990 VIN: fce81b1e-2916-492a-974a-cac9d623608d BMW 3 year 2006 VIN: 7fb6c0b3-092a-4fb6-8e7f-590443ecadcc McLaren F1 year 2014 VIN: be54715d-54b1-40d3-9323-029f27a124c3 Výhercem se stává McLaren F1 year 2014 VIN: be54715d-54b1-40d3-9323-029f27a124c3 s časem 0 hours 0 minutes 9 seconds. Pořadí v cíli: McLaren F1 year 2014 VIN: be54715d-54b1-40d3-9323-029f27a124c3, time: 0 hours 0 minutes 9 seconds. Chevrolet Corvette year 1980 VIN: 75e880b1-822d-49b5-9b5e-e8cca5f48e99, time: 0 hours 0 minutes 22 seconds. BMW 3 year 2006 VIN: 7fb6c0b3-092a-4fb6-8e7f-590443ecadcc, time: 0 hours 0 minutes 23 seconds. Volkswagen Polo year 2010 VIN: 2b8a89b2-f15d-4a5a-a14e-8de9aca023d8, time: 0 hours 0 minutes 25 seconds. Trabant P601 year 1990 VIN: fce81b1e-2916-492a-974a-cac9d623608d, time: 0 hours 0 minutes 50 seconds.
V tomto cvičení byste se měli seznámit se základním použitím debuggeru v Netbeans. Návod zde.
Javadoc je systém pro tvorbu dokumentace zdrojových kódů v Javě ve formátu prolinkovaného HTML.
Několik pomůcek: