Java中的PriorityQueue

时间:2012-10-28 17:11:22

标签: java data-structures priority-queue classcastexception

当我尝试在我的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类中。我知道队列需要知道如何订购这些元素,但我想如果你没有指定任何优先级那么它会自然地对它们进行排序?有人可以告诉我,我在做错了,谢谢。

2 个答案:

答案 0 :(得分:4)

Event需要实施the Comparable<Event> interface。这意味着您需要编写compareTo(Event)方法。没有&#34;自然&#34;订购未实现Comparable的对象。

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

答案 1 :(得分:3)

PriorityQueue是一个已排序的集合。因此,添加到它们的元素必须相互比较。

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

如果您不执行其中任何一项操作,则队列无法确定第一个元素的优先级是否高于第二个元素。