0

当我尝试在我的 Java 类中向 PriorityQueue 添加多个元素时,会引发以下异常:

java.lang.ClassCastException

添加以下消息“事件不能转换为 java.lang.Comparable

当我尝试将两个 Event 对象添加到优先级队列时,我得到了这个表达式。这是我初始化优先级队列等的方法。也许我的构造有错误,因为这是我第一次使用它:

//the instance field
private PriorityQueue<Event> queue;

//Then in the constructor
queue = new PriorityQueue<Event>();

我只是在 main 方法中对其进行测试,但这是我收到上述错误的时候:

public static void main(String[] args) {
    SimEngine engine = new SimEngine();
    Event event1 = new Event();
    Event event2 = new Event();

    engine.getQueue().offer(event1);
    engine.getQueue().offer(event2);

    System.out.println("Queue size" + engine.queue.size());

}

注意:在尝试添加到队列时,我尝试同时调用 add 和 offer。我犯了同样的错误。

以上所有代码都在我的 SimEngine 类中。我知道队列需要知道如何对这些元素进行排序,但我认为如果您不指定任何优先级,那么它会自然地对它们进行排序吗?有人可以告诉我我在这里做错了什么谢谢。

4

2 回答 2

4

Event需要实现Comparable<Event>接口。这意味着您需要编写compareTo(Event)方法。没有实现的对象没有“自然”排序Comparable

另一种选择是在Comparator<Event>构造队列时将实现传递给队列,以告诉队列如何比较Event实例。

于 2012-10-28T17:13:00.203 回答
3

PriorityQueue 是一个排序的集合。因此,您添加到其中的元素必须彼此具有可比性。

它们要么必须实现 Comparable (并且队列使用该compareTo方法隐含的自然顺序对它们进行排序),要么您必须在创建 Queue 本身时提供 Comparator (并且队列将使用此比较器来比较对象并对其进行排序)。

如果您不执行任何这些操作,则队列无法确定第一个元素是否具有比第二个更大的优先级。

于 2012-10-28T17:13:09.467 回答