0

JavaクラスのPriorityQueueに複数の要素を追加しようとすると、次の例外がスローされます。

java.lang.ClassCastException

次のメッセージを追加して、「イベントをjava.lang.Comparableにキャストできません。

2つのイベントオブジェクトを優先キューに追加しようとすると、この式が表示されます。優先キューなどを初期化する方法は次のとおりです。これを使用するのは初めてなので、構築にエラーがある可能性があります。

//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

もう1つのオプションは、実装時に実装をキューに渡して、インスタンスComparator<Event>の比較方法をキューに指示することです。Event

于 2012-10-28T17:13:00.203 に答える
3

PriorityQueueは、並べ替えられたコレクションです。したがって、それらに追加する要素は、互いに比較可能でなければなりません。

それらはComparableを実装する必要があります(そしてキューはcompareToメソッドによって暗示される自然な順序を使用してそれらをソートします)、またはキュー自体を作成するときにコンパレータを提供する必要があります(そしてキューはこのコンパレータを使用してオブジェクトを比較してソートします)。

これらのいずれも実行しない場合、キューには、最初の要素の優先度が2番目の要素よりも大きいかどうかを判断する方法がありません。

于 2012-10-28T17:13:09.467 に答える