当前位置: 首页 > 知识库问答 >
问题:

比较日期

杨柏
2023-03-14

所以今年早些时候,我在大学里接到了一个任务。任务是使用OOP程序创建一个停车场管理系统。例如,我们学习了如何使用继承、抽象类和实例。我已经完成了并通过了这个作业,所以这个问题只是为了知识目的。其中一个任务是按时间顺序对对象的 Array 列表进行排序。为此,我们学习了可比/比较器方法。但是,我无法理解它,也无法做到这一点。问题是,我们必须对数组列表中的“Vehicle”对象中的“DateTime”对象进行排序。我没有使用预定义的库作为日期和时间,因为它需要用户输入。谢谢。

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

 public abstract class Vehicle{

protected String vehicleID, brand;
protected DateTime datetime;
 }

然后我将包括一个继承的车辆类。

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


  }

接下来是dateTime类,它不使用预定义的库,并被输入到控制台中。

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


}

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

接下来是实例和主类

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

}

这是我试图对数组列表进行排序的地方。我知道它不起作用,因为数组列表是对象车辆的数组列表。我不明白如何使用可比性或比较器对对象进行排序。任何帮助都将是有价值的。

 public void printVehicleList() {

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

        }

共有2个答案

叶修永
2023-03-14

您应该在DateTime类中实现Comparable接口,并重写方法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)
   }

}

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

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

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(获取日期字段对象)!= null,否则nullPointerException将为。

洪璞瑜
2023-03-14

你想比较车辆。所以你需要一个车辆比较器,而不是日期时间比较器:

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

比较器是一个用于比较事物的独立类。你用它来调用集合.sort(车辆,比较器)

或者,您可以让事物自己实现可比(例如车辆实现可比)。然后它们可以有效地比较自己。如果某些东西实现了可比(这被称为“自然排序”)。这样做时,您可以调用Collections.sort(车辆)。那个版本的排序方法期望列表中的所有内容都实现可比,因此不需要独立的比较器来完成这项工作。

你不需要同时做这两件事。

 类似资料:
  • 目前,我正努力争取与之相比的约会。更重要的是,我有一个属性Death的人,格式是YYYY-MM-DD,如果这个人已经死了(Death 我尝试了以下做法: 但我只收到来自浏览器的解析错误。我使用的是XSL1.0版,除了xmlns:XSL=“http://www.w3.org/1999/XSL/transform”之外,没有任何名称空间。

  • 用于排序的日期比较不起作用。请指教。 我的代码: 错误: 错误:找不到返回d1的符号。与(d2)比较 符号:方法比较到(日期) 位置:日期类型的变量d1 注意:某些输入文件使用或重写了不推荐的API 注意:使用-Xlint:deprecation重新编译以获取详细信息 注意:某些输入文件使用未检查或不安全的操作 注意:使用-Xlint重新编译:未选中以获取详细信息。

  • 问题内容: 在MySQL中,如果我有日期范围的列表(范围开始和范围结束)。例如 我想检查另一个日期范围是否包含列表中已经存在的任何范围,我该怎么做? 例如 问题答案: 这是一个经典问题,如果您逆转逻辑,实际上会更容易。 让我举一个例子。 我将在此处发布一个时间段,以及其他时间段的所有不同变体以某种方式重叠。 另一方面,让我发布所有不重叠的内容: 因此,如果您简单地将比较简化为: 那么您将找到所有不

  • 问题内容: 请有人帮忙…为什么查询不起作用.. ?? 问题答案: 在Oracle中,一个总有一个时间成分。您的客户端可能显示也可能不显示时间分量,但是当您尝试进行相等比较时,它仍然存在。您还总是希望将日期与日期而不是字符串进行比较,后者使用当前会话进行隐式转换,从而使它们相当脆弱。THat将涉及ANSI日期文字或显式调用 您可以使用该函数将截断到午夜 或者,您可以进行范围比较(如果您可以受益于的索

  • 我有一个rails生成的日期和一个jQuery生成的日期。 导轨日期打印如下: jQuery日期打印如下: 我想检查jQuery日期是大于还是小于rails日期。但是不管日期如何,jQuery日期总是被解释为比rails日期大。 为什么会这样,我怎样才能成功地比较这两个日期? 更新: 事实上,我刚刚发现问题在于它只允许1969年之前的日期。我打算代码只允许18岁以上的日期。有人知道为什么不同吗?

  • 问题内容: 当比较Javascript中的日期对象时,我发现即使比较同一日期也不会返回true。 我如何比较这些日期的相等性?我对利用JS 的本机对象(而不是任何第三方库)感兴趣,因为它不适合仅使用第三方JS来比较日期。 问题答案: 这是因为在第二种情况下,将比较实际的日期对象,并且两个对象永远不会彼此相等。强迫他们编号: 如果要更明确地转换为数字,请使用以下任一方法: 要么 哦,对规范的引用:§