2017-07-24 12 views
0

中比较了Date&Time班级,我在大学获得了一份任务。该任务是通过使用面向对象程序创建停车场管理系统。例如,我们学习了如何使用继承,抽象类和实例。我已经完成并通过了这个任务,所以这个问题只是为了知识的目的。其中一项任务是按时间顺序排列对象的ArrayList。为了做到这一点,我们接受了比较/比较的教导。但是,我无法理解它,并且无法做到。问题是,我们必须订购一个'DateTime'对象,它位于数组列表中的'Vehicle'对象中。我不使用预定义的库文件作为日期和时间,因为它需要用户输入。 谢谢。在今年早些时候,我在另一个班级JAVA

所以首先这里是抽象的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(); 
    } 
} 

} 

这里就是我想排序数组列表。我知道这不起作用,因为Arraylist是对象车辆的Arraylist。我不明白我会如何使用可比较的或比较器对对象进行排序。任何帮助都会受到干扰。

public void printVehicleList() { 

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

     } 
+1

参考https://stackoverflow.com/help/how-to-ask ..Post仅需要 – Akshay

回答

1

您想比较车辆。所以,你需要一个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是一个独立的类来比较的东西。你用它来呼叫Collections.sort(vehicles, comparator)

或者您可以自己制作东西Comparable(例如Vehicle implements Comparable)。然后他们可以有效地比较自己。如果有东西实现Comparable(这被称为“自然顺序”)。 这样做时,您可以拨打Collections.sort(vehicles)。该版本的排序方法期望列表中的所有内容都实现Comparable,因此不需要独立的Comparator即可完成此工作。

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

+0

会怎么能够把这个抽象类或创建一个全新的类的代码? – JdotHello

+0

@jdotHello已经更新了答案。将它作为一个完全独立的类。 –

0

您应该在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) 
    } 

} 

我也件事,上课日期时间的contstructor你应该检查时间是23介于0和,分0 59等之间

要在主排序它,你应该实现Comparable接口汽车类

public class VehicleComparator implements Comparator<Vehicle> { 

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

OR

public void printVehicleList() { 


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

照顾那v1(获得dateTime fild的对象)!= null,否则就是nullPointerException。

+0

我会给这个去感谢你。是的,你对我尚未完成的验证是正确的。谢谢 – JdotHello

+0

你会怎么称呼这个来自主班? – JdotHello

+0

谢谢你如果我可以选择两个答案是正确的,我会:) – JdotHello

相关问题