so earlier this year I was given an assignment at university. The assignment was to create a Car park management system by using OOP procedures. For example, we learnt how to use inheritance, abstract classes and instances. I have already completed and passed this assignment so this question is just for knowledge purposes. One of the tasks was to order the ArrayList of objects in chronological order. To do this, we was taught the comparable/comparator way. However, I could not get my head around it and was unable to do it. The problem was, we had to order a 'DateTime' object which was in a 'Vehicle' object in the arraylist. I am not using a predefined libary for the date and time as it needed to be user entered. Thanks.
So first of all here is the abstract Vehicle class.
public abstract class Vehicle{
protected String vehicleID, brand;
protected DateTime datetime;
}
Then i'll include one of the inherited vehicle classes.
public class Car extends Vehicle {
protected String colour;
protected int numOfDoors;
public Car(String brand, String vehicleID, int numOfDoors, String colour) {
this.vehicleID = vehicleID;
this.brand = brand;
this.numOfDoors = numOfDoors;
this.colour = colour;
}
public void setColour(String colour) {
this.colour = colour;
}
public void setvehicleID(String vehicleID) {
this.vehicleID = vehicleID;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColour() {
return this.colour;
}
public String getVehicleID() {
return this.vehicleID;
}
public String getBrand() {
return this.brand;
}
public String toString() {
return "Car";
}
public int getNumOfDoors() {
return numOfDoors;
}
public void setNumOfDoors(int numOfDoors) {
this.numOfDoors = numOfDoors;
}
public DateTime getDatetime() {
return datetime;
}
public void setDatetime(DateTime datetime) {
this.datetime = datetime;
}
}
Next up is the dateTime class that does not use a predefined library and is entered in to the console.
import java.util.Comparator;
public class DateTime implements Comparator<DateTime> {
protected int day, month, year, minutes, hours;
public DateTime() {
}
public DateTime(int minutes, int hours, int day, int month, int year) {
this.minutes = minutes;
this.hours = hours;
this.day = day;
this.month = month;
this.year = year;
}
@Override
public String toString() {
return day+"/"+month+"/"+year + " " + minutes+":"+hours;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMinutes() {
return minutes;
}
public void setMinutes(int minutes) {
this.minutes = minutes;
}
public int getHours() {
return hours;
}
public void setHours(int hours) {
this.hours = hours;
}
@Override
public int compareTo(DateTime o) {
int returnValue = 0;
if (this.year > o.getYear())
returnValue = 1;
else
returnValue = -1;
return returnValue;
}
@Override
public int compare(DateTime o1, DateTime o2) {
return o1.year - o2.year;
}
}
As you can see I have tried to use the comparable and comparator.
Next the instance and the main class
public interface CarParkManager {
public abstract void addVehicle(Vehicle vehicle);
public abstract void printVehicleList();
public abstract void deleteVehicle();
public abstract boolean runMenu();
}
Main:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class MyCarParkManager implements CarParkManager {
private ArrayList<Vehicle> vehicles;
private int numSpaces, doors, day, month, year, minutes, hour;
private String brand, vehicleID, colour, engineSize, cargoVolume;
Scanner in = new Scanner(System.in);
public MyCarParkManager(int vehicleList) {
vehicles = new ArrayList<Vehicle>();
this.numSpaces = vehicleList;
}
public void addVehicle(Vehicle vehicle) {
if (vehicles.size() < numSpaces) {
vehicles.add(vehicle);
numSpaces--;
System.out.println("Spaces left: " + numSpaces);
} else {
System.out.println("Not enough spaces.");
}
}
@Override
public void deleteVehicle() {
for (int i = 0; i < vehicles.size(); i++) {
System.out.println(vehicles.get(i).vehicleID);
}
System.out.println("Please enter vehicle ID you wish to delete");
String idDelete = in.next();
for (int i = 0; i < vehicles.size(); i++) {
if(vehicles.get(i).vehicleID.equals(idDelete)){
System.out.println("The " + vehicles.get(i).toString() + " was
deleted.");
vehicles.remove(i);
}
}
}
@Override
public void printVehicleList() {
for (int i = 0; i < vehicles.size(); i++) {
Collections.sort(vehicles, new DateTime());
}
}
@Override
public boolean runMenu() {
boolean exit = false;
System.out.println("Please enter desired function");
System.out.println("Enter 1 to add a vehicle");
System.out.println("Enter 2 to delete a parked vehicle");
System.out.println("Enter 3 to display already parked vehicles");
int choice = in.nextInt();
switch (choice) {
case 1:
System.out.println("Enter 1 to add a car");
System.out.println("Enter 2 to add a van");
System.out.println("Enter 3 to add a bike");
int choice2 = in.nextInt();
switch (choice2) {
case 1:
System.out.println("Please enter brand of car");
brand = in.next();
System.out.println("Please enter vehicleID");
vehicleID = in.next();
System.out.println("Please enter number of doors");
doors = in.nextInt();
System.out.println("Please enter colour of the car");
colour = in.next();
System.out.println("Please enter the minutes of parked
vehicle");
minutes = in.nextInt();
System.out.println("Please enter hour of parked
vehicle");
hour = in.nextInt();
System.out.println("Please enter day");
day = in.nextInt();
System.out.println("Please enter month");
month = in.nextInt();
System.out.println("Please enter year");
year = in.nextInt();
DateTime datetime = new DateTime(minutes, hour, day, month, year);
Car c = new Car(brand, vehicleID, doors, colour);
c.setDatetime(datetime);
addVehicle(c);
break;
case 2:
System.out.println("Please enter brand of car");
brand = in.next();
System.out.println("Please enter vehicleID");
vehicleID = in.next();
System.out.println("Please enter cargoVolume");
cargoVolume = in.next();
System.out.println("Please enter the minutes of parked
vehicle");
minutes = in.nextInt();
System.out.println("Please enter hour of parked
vehicle");
hour = in.nextInt();
System.out.println("Please enter day");
day = in.nextInt();
System.out.println("Please enter month");
month = in.nextInt();
System.out.println("Please enter year");
year = in.nextInt();
DateTime vanDateTime = new DateTime(minutes, hour, day, month, year);
Van v = new Van(brand, vehicleID, cargoVolume);
v.setDatetime(vanDateTime);
addVehicle(v);
break;
case 3:
System.out.println("Please enter brand of car");
brand = in.next();
System.out.println("Please enter vehicleID");
vehicleID = in.next();
System.out.println("Please enter engine size");
engineSize = in.next();
System.out.println("Please enter the minutes of parked vehicle");
minutes = in.nextInt();
System.out.println("Please enter hour of parked vehicle");
hour = in.nextInt();
System.out.println("Please enter day");
day = in.nextInt();
System.out.println("Please enter month");
month = in.nextInt();
System.out.println("Please enter year");
year = in.nextInt();
DateTime bikeDateTime = new DateTime(minutes, hour, day, month, year);
Bike b = new Bike(brand, vehicleID, engineSize);
b.setDatetime(bikeDateTime);
addVehicle(b);
break;
}
break;
case 2:
deleteVehicle();
break;
case 3:
printVehicleList();
break;
}
return exit;
}
public static void main(String[] args) {
CarParkManager carPark = new MyCarParkManager(20);
boolean exit = false;
while (!exit) {
exit = carPark.runMenu();
}
}
}
Here is where I am trying to sort the arraylist. I understand that it's not working because the Arraylist is an Arraylist of object vehicles. I don't understand how I would sort the object using comparable or comparator. Any help would be appericated.
public void printVehicleList() {
for (int i = 0; i < vehicles.size(); i++) {
Collections.sort(vehicles, new DateTime());
}
}
You want to compare Vehicles. So you'll need a VehicleComparator, not a DateTime comparator:
public class VehicleComparator implements Comparator<Vehicle> {
@Override
public int compare(Vehicle o1, Vehicle o2) {
// now get the two vehicle's dates and compare them
}
}
Then
Collections.sort(vehicles, new VehicleComparator());
Update:
Also, you don't need a Comparator
AND a Comparable
.
A Comparator
is a standalone class to compare things. You use that to call Collections.sort(vehicles, comparator)
.
Alternatively you can make things implement Comparable
themselves (e.g. Vehicle implements Comparable
). Then they can effectively compare themselves. If something implements Comparable
(this is known as "natural ordering").
When doing it this way, you can call Collections.sort(vehicles)
. That version of the sort method expects everything in the list to implement Comparable
, and so doesn't need a standalone Comparator
to do that work for it.
You don't need to do both.