比较另一个 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());
更新:
此外,您不需要 Comparator
和 Comparable
。
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。
所以今年早些时候我在大学被分配了一项任务。任务是使用 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());
更新:
此外,您不需要 Comparator
和 Comparable
。
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。