Должен ли я использовать Comparator или Comparable при попытке использовать очередь приоритетов с этим универсальным классом?

При попытке дать приоритет общим объектам в очереди приоритетов, что я могу использовать для их сравнения? Можно ли определить и использовать переопределенный метод CompareTo из интерфейса Comparable или переопределенный метод Compare из интерфейса Comparator? Или я могу использовать один или другой? Спасибо

Вот переменные экземпляра, конструктор класса и текущий метод compareTo.

private LocalTime scheduledTime; //the scheduled time of the flight
private Event.EventType eventType; //the event type of the flight (arrival or departure)
private String identifier;  // the identifier of the flight
private LocalTime actualTime; //the actual time the flight uses a runway
private Runway runwayUsed; //the runway the flight used to arrive or depart
private int reserveTime; // time the flight uses to reserve a runway 
private LocalTime runwayAvailableTime;


/**
 * Constructor
 * @param scheduledTime the scheduled time of the flight
 * @param eventType the event of the flight (arrival or departure)
 * @param identifier the identifier of the flight
 */
protected Flight(String scheduledTime, String eventType, String identifier) {


    this.scheduledTime = LocalTime.parse(scheduledTime);
    this.eventType = EventType.valueOf(eventType);
    this.identifier = identifier;
    this.actualTime = null;
    this.runwayUsed = null;

} 

//Here is the compareTo method I am currently using. Should I use compare //from the Comparator interface instead?
@Override
public int compareTo(Event otherFlight) {

    Event tmpFlight = (Event) otherFlight;


        if(this.scheduledTime.compareTo(tempFlight.getScheduledTime()) == 0) {
        if(this.eventType.compareTo(tempFlight.getEvent()) == 0){
            return 0;
        } 
        else if(this.eventType.compareTo(tempFlight.getEvent()) > 0){
            return 1;
        } 
        else {
            return -1;
        } 
    } 
    else if(this.scheduledTime.compareTo(tempFlight.getScheduledTime()) < 0) {
        return -1;
    } 
    else {
        return 1;
    }  }

1 ответ

Решение

Как вы уже реализовали compareTo, у тебя есть ComparableFlight или же Event экземпляров.

Это означает, что вы готовы использовать его с Comparable объекты. Все нижеприведенное должно работать:

Queue<Event> eventQueue = new PriorityQueue<>();
eventQueue.add(new Flight(scheduledTime, eventType, identifier));

Или же:

List<Flight> flightList = Arrays.asList(new Flight(scheduledTime, 
                           eventType, identifier));
Queue<Flight> flightQueue = new PriorityQueue<>(flightList);

Или же:

List<Event> eventList = ...;
Queue<Event> eventQueue = new PriorityQueue<>(eventList);

PiorityQueue класс должен иметь возможность обрабатывать приоритет в соответствии с порядком, заданным вашим compareTo упорядоченность.

Примечание: если ваш List<Event> имеет объекты других классов, которые реализуют Event, то вы должны убедиться, что эти другие классы также имеют compareTo(Event otherFlight), В противном случае приоритетная очередь может вызвать исключения во время выполнения.
Лучший вариант может быть просто объявить Flight в качестве реализации Comparable<Flight> и создать экземпляр PriorityQueue<Flight> очередь.

Другие вопросы по тегам