尝试将优先级队列与这个泛型类一起使用时,我应该使用 Comparator 还是 Comparable ?

Posted

技术标签:

【中文标题】尝试将优先级队列与这个泛型类一起使用时,我应该使用 Comparator 还是 Comparable ?【英文标题】:Should I use Comparator or Comparable when trying to use a Priority Queue with this generic class? 【发布时间】:2018-04-01 14:56:48 【问题描述】:

当尝试在优先级队列中赋予通用对象优先级时,我可以使用什么来比较它们?我可以定义和使用 Comparable 接口中重写的 CompareTo 方法或 Comparator 接口中重写的 Compare 方法吗?或者我可以使用其中一个吗?谢谢

这里是实例变量、类的构造函数和当前的 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;
      

【问题讨论】:

你可以使用任何一个。实现什么是你的选择…… 在做决定之前阅读这个***.com/questions/420223/…,它们是不一样的。 在上述情况下我应该使用哪个? 您的Flight 类是如何声明的?为什么你有compareTo(Event) 而不是compareTo(Flight) 根据 Prabin Paudel 发布的信息,我认为我想比较 Flight 对象的方式不是“自然顺序”,所以我应该使用 Comparator 接口的 compare 方法,对吗? 【参考方案1】:

由于您已经实现了compareTo,因此您拥有Comparable FlightEvent 实例。

这意味着您可以将它与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&lt;Event&gt; 具有实现Event 的其他类的对象,那么您必须确保这些其他类也具有compareTo(Event otherFlight)。否则,优先级队列可能会在运行时引发异常。 最好的选择可能是将Flight 声明为实现Comparable&lt;Flight&gt; 并实例化PriorityQueue&lt;Flight&gt; 队列。

【讨论】:

感谢您的回复。因为我没有按“自然顺序”进行比较,所以我认为我必须实现 Comparator 接口并使用 compare 方法。感谢您让我知道,在使用 Flight 或 Event 对象的优先队列时,我可以使用 Comparable 接口的 compareTo 方法。

以上是关于尝试将优先级队列与这个泛型类一起使用时,我应该使用 Comparator 还是 Comparable ?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 .NET 泛型类实现 COM 接口?

泛型类中的数组

Jackson - 使用泛型类反序列化

将优先级队列与文件阅读器一起使用

C#,MVC3,如何将非泛型 DBSet 与运行时定义的类型一起使用?

这个嵌套类构造函数片段可以应用于泛型类吗?