2017-07-24 4 views
0

donc plus tôt cette année, j'ai reçu une affectation à l'université. La mission consistait à créer un système de gestion de parking en utilisant les procédures OOP. Par exemple, nous avons appris à utiliser l'héritage, les classes abstraites et les instances. J'ai déjà terminé et passé cette affectation afin que cette question soit juste à des fins de connaissance. L'une des tâches consistait à commander l'ArrayList d'objets dans l'ordre chronologique. Pour ce faire, nous avons appris la manière comparable/comparative. Cependant, je ne pouvais pas comprendre ce qui se passait et j'étais incapable de le faire. Le problème était, nous avons dû commander un objet 'DateTime' qui était dans un objet 'Vehicle' dans l'arraylist. Je n'utilise pas de librairie prédéfinie pour la date et l'heure car elle devait être saisie par l'utilisateur. Merci.En comparant la classe Date & Time dans une autre classe JAVA

Alors tout d'abord voici la classe abstraite Vehicle.

public abstract class Vehicle{ 

protected String vehicleID, brand; 
protected DateTime datetime; 
} 

Ensuite, je vais inclure l'une des classes de véhicules héritées.

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


    } 

Ensuite est la classe DateTime qui n'utilise pas une bibliothèque prédéfinie et est entré à la 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; 
} 


} 

Comme vous pouvez le voir, j'ai essayé d'utiliser le comparateur et le comparateur.

Suivant l'instance et la classe principale

public interface CarParkManager { 

public abstract void addVehicle(Vehicle vehicle); 

public abstract void printVehicleList(); 

public abstract void deleteVehicle(); 

public abstract boolean runMenu(); 
} 

principal:

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

} 

Ici, je suis en train de trier le arraylist. Je comprends que cela ne fonctionne pas parce que l'Arraylist est un Arraylist de véhicules d'objet. Je ne comprends pas comment je trierais l'objet en utilisant un comparateur ou un comparateur. Toute aide serait appérialisée.

public void printVehicleList() { 

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

     } 
+1

Référer https://stackoverflow.com/help/how-to-ask ..Publier uniquement le code requis – Akshay

Répondre

1

Vous voulez comparer Véhicules. Donc, vous aurez besoin d'un VehicleComparator, pas un comparateur 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 
    } 
} 

Puis

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

Mise à jour:

En outre, vous n'avez pas besoin d'un Comparator et un Comparable. Un Comparator est une classe autonome pour comparer les choses. Vous l'utilisez pour appeler Collections.sort(vehicles, comparator).

Alternativement vous pouvez faire des choses à mettre en œuvre eux-mêmes Comparable (par exemple Vehicle implements Comparable). Ensuite, ils peuvent se comparer efficacement. Si quelque chose implémente Comparable (ceci est connu comme "ordre naturel"). En procédant ainsi, vous pouvez appeler Collections.sort(vehicles). Cette version de la méthode de tri s'attend à ce que tout ce qui est dans la liste implémente Comparable, et n'a donc pas besoin d'un Comparator autonome pour le faire.

Vous n'avez pas besoin de faire les deux.

+0

Serais-je en mesure de mettre cela dans la classe abstraite ou de créer une nouvelle classe? – JdotHello

+0

@jdotHello a mis à jour la réponse. Je l'aurais comme une classe totalement autonome. –

0

Vous devez implémenter une interface comparable dans votre classe DateTime et remplacer la méthode compareTo et comparer pour le tri.

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

} 

J'ai aussi chose que contstructor de DateTime de classe que vous devriez vérifier cette heure est comprise entre 0 et 23, minutes sont comprises entre 0 et 59 etc

Pour ce SORT principal vous devez implémenter l'interface Comparable en classe de véhicule

public class VehicleComparator implements Comparator<Vehicle> { 

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

OU

public void printVehicleList() { 


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

Et prendre soin que v1 (objet qui reçoit dateTime fild)! = null, sinon nullPointerException sera.

+0

je vais essayer, merci. Et oui vous avez raison avec les validations je ne les ai pas encore faites. merci – JdotHello

+0

Comment appelleriez-vous cela de la classe principale? – JdotHello

+0

Merci aussi Si je pouvais choisir les deux réponses pour être correct je le ferais :) – JdotHello