比较另一个 class JAVA 中的日期和时间 class

Comparing the Date & Time class in another class JAVA

所以今年早些时候我在大学被分配了一项任务。任务是使用 OOP 程序创建一个停车场管理系统。例如,我们学习了如何使用继承、抽象 classes 和实例。我已经完成并通过了这项作业,所以这个问题仅供参考。其中一项任务是按时间顺序排列对象的 ArrayList。为此,我们学习了 comparable/comparator 方法。但是,我无法理解它,也无法做到。问题是,我们必须订购数组列表中 'Vehicle' 对象中的 'DateTime' 对象。我没有为日期和时间使用预定义的库,因为它需要用户输入。 谢谢。

所以这里首先是抽象的 Vehicle class。

 public abstract class Vehicle{

protected String vehicleID, brand;
protected DateTime datetime;
 }

然后我将包括其中一辆继承的车辆 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;
}


  }

接下来是不使用预定义库并输入到控制台的日期时间class。

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;
}


}

如您所见,我已尝试使用可比较和比较器。

接下来是实例和主体class

 public interface CarParkManager {

public abstract void addVehicle(Vehicle vehicle);

public abstract void printVehicleList();

public abstract void deleteVehicle();

public abstract boolean runMenu();
}

主要:

 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();
    }
}

}

这是我尝试对数组列表进行排序的地方。我知道它不起作用,因为 Arraylist 是对象车辆的 Arraylist。我不明白如何使用可比对象或比较器对对象进行排序。任何帮助都会得到应用。

 public void printVehicleList() {

        for (int i = 0; i < vehicles.size(); i++) {
                    Collections.sort(vehicles, new DateTime());
        }

        }

您想比较车辆。所以你需要一个 VehicleComparator,而不是 DateTime 比较器:

public class VehicleComparator implements Comparator<Vehicle> {
    @Override
    public int compare(Vehicle o1, Vehicle o2) {
        // now get the two vehicle's dates and compare them
    }
}

然后

Collections.sort(vehicles, new VehicleComparator());

更新:

此外,您不需要 ComparatorComparable

A Comparator 是一个独立的 class 来比较事物。你用它来调用 Collections.sort(vehicles, comparator).

或者你可以让事情自己实现Comparable(例如Vehicle implements Comparable)。然后他们可以有效地比较自己。如果某物实现 Comparable(这称为 "natural ordering")。 这样做时,您可以调用Collections.sort(vehicles)。该版本的排序方法期望列表中的所有内容都实现 Comparable,因此不需要独立的 Comparator 来完成这项工作。

你不需要两者都做。

您应该在 DateTime 中实现 Comparable 接口 class 并覆盖方法 compareTo,并进行比较以进行排序。

public class DateTime implements Comparator<DateTime>, Comparable<DateTime> {

    ...
    @Override
    public int compareTo(DateTime dateTime) {
        if (year > dateTime.year) {
            return 1;
        } else if (month > dateTime.month) {
            return 1;
        } ...
    }

    @Override
   public int compare(DateTime dateTime1, DateTime dateTime2) {
       return dateTime1.compareTo(dateTime2)
   }

}

我还认为在 class DateTime 的构造函数中你应该检查小时在 0 到 23 之间,分钟在 0 到 59 之间等等

要在 main 中对其进行排序,您应该在 Vehicle 中实现 Comparable 接口 class

public class VehicleComparator implements Comparator<Vehicle> {

    @Override
    public int compare(Vehicle vehicle1, Vehicle vehicle2) {
        return vehicle1.dateTime.compareTo(vehicle2.dateTime);    
    }
}

public void printVehicleList() {


 Collections.sort(vehicles, new Comparator<Vehicle>(){
     public int compare(Vehicle v1, Vehicle v2){
         return v1.dateTime.compareTo(v2.dateTime);
     }
});

并注意 v1(object which get dateTime fild) != null,否则会出现 nullPointerException。