183 lines
9.3 KiB
Java
183 lines
9.3 KiB
Java
|
package Lab6;
|
|||
|
|
|||
|
import java.util.ArrayList;
|
|||
|
import java.util.List;
|
|||
|
import java.util.Scanner;
|
|||
|
|
|||
|
public class TaxiPark {
|
|||
|
|
|||
|
private static List<Car> cars;
|
|||
|
|
|||
|
public TaxiPark() {
|
|||
|
cars = new ArrayList<>();
|
|||
|
} // Створюємо у таксопарка масив машин
|
|||
|
|
|||
|
public void addAutomobile(Car car) {cars.add(car);} // Метод для додавання машини у таксопарк
|
|||
|
|
|||
|
// Метод для додавання машини у таксопарк, але користувачем
|
|||
|
public void addAutomobileConsole(String carType, String maker, String model, int year, int price, int speed, double fuelConsumption, Object additionalProperty){
|
|||
|
Car car;
|
|||
|
switch (carType) { // Удосконалений switch для створення конкретного типу машини
|
|||
|
case "Coupe" ->
|
|||
|
car = new Coupe(maker, model, year, price, speed, fuelConsumption, (String) additionalProperty); //
|
|||
|
// Я придумав, що у купе поліморфізм виражається у тому, що вона може бути купе, без криші, туфелькою
|
|||
|
// я дуже погано в машинах розбираюсь, тому надіюсь ви мене зрозуміли
|
|||
|
case "Hatchback", "Sedan" ->
|
|||
|
car = new Hatchback(maker, model, year, price, speed, fuelConsumption, (int) additionalProperty);
|
|||
|
default -> {
|
|||
|
System.out.println("Invalid car type");
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
addAutomobile(car); // Виклик метода для додаваня машини у таксопарк, можна було без нього,
|
|||
|
// одною строкою, але так мені це показалось логічним
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public double calculateFleetCost() { // Метод для обрахунку ціни усіх машин
|
|||
|
double totalCost = 0.0;
|
|||
|
for (Car car : cars) {
|
|||
|
totalCost += car.getPrice(); // Перебираємо усі машини, викликаємо у них метод getPrice()
|
|||
|
}
|
|||
|
return totalCost; // Повертаємо результат
|
|||
|
}
|
|||
|
|
|||
|
public List<Car> findCarsBySpeedRange(int minSpeed, int maxSpeed) { // Метод для знаходження машин у діапазоні
|
|||
|
List<Car> carsInSpeedRange = new ArrayList<>();
|
|||
|
for (Car car : cars) {
|
|||
|
if (car.getSpeed() >= minSpeed && car.getSpeed() <= maxSpeed) {
|
|||
|
carsInSpeedRange.add(car); // Перебираємо машини, які задовольняються умові діапазону
|
|||
|
}
|
|||
|
}
|
|||
|
return carsInSpeedRange;
|
|||
|
}
|
|||
|
public void boardCars(List<Car> cars){ // Метод для будування таблиці, приймає масив машин, і створює красиву табличку
|
|||
|
System.out.println("----------------------------------------------------------------------------");
|
|||
|
System.out.printf("%-10s | %-7s | %-6s | %-6s | %-5s | %-5s | %-10s | %n",
|
|||
|
"Maker", "Model", "Year", "Price", "Speed", "Fuel", "Special");
|
|||
|
System.out.println("----------------------------------------------------------------------------");
|
|||
|
for (Car car : cars) {
|
|||
|
System.out.println(car.toString());
|
|||
|
}
|
|||
|
System.out.println("----------------------------------------------------------------------------");
|
|||
|
}
|
|||
|
|
|||
|
public void sortByFuelConsumption() { // Метод у таксопарка, який викликає клас для сортування
|
|||
|
|
|||
|
cars.sort(new SortByFuelConsuming());
|
|||
|
boardCars(TaxiPark.cars); // будуємо відсортовану табличку
|
|||
|
}
|
|||
|
|
|||
|
public static void main(String[] args) {
|
|||
|
int C13 = 2401 % 13;
|
|||
|
System.out.println("C13 - " + C13 + ", отже треба створити таксопар та ієрархію автомобілів.");
|
|||
|
System.out.println("--------------------------------------------------------------\n");
|
|||
|
|
|||
|
TaxiPark taxiPark = new TaxiPark();
|
|||
|
|
|||
|
// Додати автомобілі до таксопарку
|
|||
|
taxiPark.addAutomobile(new Sedan("Toyota", "Camry", 2020, 3500, 220, 7.5, 5));
|
|||
|
taxiPark.addAutomobile(new Coupe("BMW", "M4", 2021, 3000, 150, 9.2, "Coupe"));
|
|||
|
taxiPark.addAutomobile(new Hatchback("Volkswagen", "Golf", 2019, 6000, 200, 6.8, 6));
|
|||
|
|
|||
|
Scanner scanner = new Scanner(System.in); // Під'єднуємо сканер
|
|||
|
boolean quit = false;
|
|||
|
while (!quit) { // Нескінченний цикл поки користувач не введе 'q'
|
|||
|
|
|||
|
System.out.print("""
|
|||
|
Enter:
|
|||
|
'cost' - show total fleet
|
|||
|
'sort' - show cars sorted by fuel consumption
|
|||
|
'board' - show cars
|
|||
|
'add' - buy car on your TaxiPark
|
|||
|
'find' - find cars that in speed diapason
|
|||
|
or enter 'q' to exit:\s""");
|
|||
|
String input = scanner.nextLine();
|
|||
|
// Перевірка чи правильно введено слово
|
|||
|
if (!input.equals("cost") && !input.equals("sort") && !input.equals("board") && !input.equals("add") && !input.equals("q") && !input.equals("find")) {
|
|||
|
System.out.println("Invalid field to sort by! Please enter 'cost', 'sort', 'board', 'add', 'find'.");
|
|||
|
continue;
|
|||
|
}
|
|||
|
// Перевірка виходу з програми
|
|||
|
if (input.equals("q")) {
|
|||
|
quit = true;
|
|||
|
System.out.println("Closing program...");
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (input.equals("cost")){
|
|||
|
// Порахувати вартість автопарку
|
|||
|
double fleetCost = taxiPark.calculateFleetCost(); // Викликаємо метод, який вже описав
|
|||
|
System.out.println("Total fleet cost: $" + fleetCost);
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (input.equals("sort")){
|
|||
|
// Відсортувати автомобілі за витратами палива
|
|||
|
taxiPark.sortByFuelConsumption();
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (input.equals("board")){
|
|||
|
taxiPark.boardCars(TaxiPark.cars); // Виведення таблички
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
if (input.equals("find")){
|
|||
|
int minSpeed, maxSpeed;
|
|||
|
System.out.println("Enter min speed: "); // Користувач вводе межі діапазона
|
|||
|
minSpeed = scanner.nextInt();
|
|||
|
System.out.println("Enter max speed:");
|
|||
|
maxSpeed = scanner.nextInt();
|
|||
|
scanner.nextLine(); // Тут залишався \n тому ми його з'їли
|
|||
|
List<Car> carsInSpeedRange = taxiPark.findCarsBySpeedRange(minSpeed, maxSpeed); // Масив машин діапазону
|
|||
|
System.out.println("Cars within the speed range of " + minSpeed + " km/h to " + maxSpeed + " km/h:");
|
|||
|
taxiPark.boardCars(carsInSpeedRange); // Створенний масив передаємо методу для будування таблички
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
if (input.equals("add")){
|
|||
|
// Користувач вводе багато значень, перевірки не добавив, тому акуратно)
|
|||
|
System.out.println("Choose type of car: 'Sedan', 'Coupe', 'Hatchback'");
|
|||
|
String carType = scanner.nextLine();
|
|||
|
System.out.println("Enter Maker: ");
|
|||
|
String maker = scanner.nextLine();
|
|||
|
System.out.println("Enter Model: ");
|
|||
|
String model = scanner.nextLine();
|
|||
|
System.out.println("Enter year: ");
|
|||
|
int year = scanner.nextInt();
|
|||
|
System.out.println("Enter price (int)");
|
|||
|
int price = scanner.nextInt();
|
|||
|
System.out.println("Enter speed (int)");
|
|||
|
int speed = scanner.nextInt();
|
|||
|
System.out.println("Enter fuel consumption");
|
|||
|
double fuelConsumption = scanner.nextDouble();
|
|||
|
scanner.nextLine();
|
|||
|
Object additionalProperty = null; // Абстрактний об'єкт, далі в switch він набуде тип
|
|||
|
|
|||
|
switch (carType) {
|
|||
|
case "Sedan", "Hatchback" -> {
|
|||
|
System.out.println("Enter special(int):");
|
|||
|
additionalProperty = scanner.nextInt();
|
|||
|
}
|
|||
|
|
|||
|
case "Coupe" -> {
|
|||
|
System.out.println("Enter special(any):");
|
|||
|
additionalProperty = scanner.nextLine();
|
|||
|
}
|
|||
|
default -> System.out.println("Invalid car type");
|
|||
|
}
|
|||
|
// Передаємо всі введені значення методу для купівлі машини у таксопарк
|
|||
|
taxiPark.addAutomobileConsole(carType, maker, model, year, price, speed, fuelConsumption, additionalProperty);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|