2

こんにちは、プライオリティ キューとコンパレータで少し迷っています。Javaでコンパレータを作成する方法が本当にわかり ませ んアイデアですが、私はまだそれを行う方法にこだわっています PriorityQueue を使用するにはどうすればよいですか?

私が持っているのは、優先度、到着時間、終了時間を持つオブジェクトを作成するクラスです。また、それらを配置するための優先キューもいくつかあります。開始したら、それらを到着キューに入れて並べ替え、最初に到着したものを確認し、それをキュー 1 に入れます。しかし、到着キューに 2 番目のものを追加しようとすると、失敗して例外がスローされます。最初にやりたいことは、すべてのプロセスを到着キューに追加してから、それらを並べ替えて、到着時間が最小のプロセスが到着キューから最初に出てキュー 1 に入るようにすることです。これについて助けてくれてありがとう

    //the comparator
    Comparator<Integer> comparator = new Comparator();
    //priority queues
    //only needs 10 elements to  hold
    PriorityQueue one = new PriorityQueue(10, comparator);
    PriorityQueue two = new PriorityQueue(10, comparator);
    PriorityQueue three = new PriorityQueue(10, comparator);
    PriorityQueue four = new PriorityQueue(10, comparator);
    PriorityQueue arrival = new PriorityQueue(10, comparator);

    //put all processes in arrival queue
    arrival.add(p1);
    arrival.add(p2);
    arrival.add(p3);
    arrival.add(p4);
    arrival.add(p5);
    arrival.add(p6);
    arrival.add(p7);
    arrival.add(p8);
    arrival.add(p9);
    arrival.add(p10);
4

1 に答える 1

9

Comparator現時点では、あなたが書いたものはコンパイルさえできないと思うので、あなたがどのように を定義しているか見てみましょう。

Comparatorはインターフェースです。つまり、それを実装するクラスを定義する必要があります。つまり、インターフェイスによって記述されたメソッドの具体的な実装を持つクラスを定義する必要があります。ここで、心配する必要があるメソッドは 1 つだけですcompare。(インターフェイスは も定義しますが、それは上のものと同じであり、すべてのクラスがデフォルトでこれを実装するためequals、奇妙な選択です...)Object

このcompareメソッドは、ターゲット タイプの 2 つのオブジェクトを取り、どちらが他方より「前」に来るかを決定します。戻り値:

最初の引数が 2 番目の引数より小さい、等しい、または大きい場合は、負の整数、ゼロ、または正の整数。

p1したがって、インスタンスのクラスが何であれ、オブジェクトを比較したいとしますp2(私はそれを と呼びますMyClass)。つまり、クラスを定義する必要があります。

class MyComparator implements Comparator<MyClass> {

    public int compare(MyClass a, MyClass b) {
        // TODO
    }
}

compare メソッドは、どの引数が他の引数の前にあるかに応じて値を返す必要があることがわかっていMyClassます。あなたの質問で、最初に来るものは、到着時間が最も短い(つまり、最も早い?)ものだと言いました。

これは実際には非常に簡単です。これは、オブジェクトのいわゆる自然順序付けであるためです。比較の結果は全体的比較と同じであるため、java.util.Dateオブジェクトの到着時間を直接比較することができます。

したがって、 の実装は次のcompareようになります (適切な名前のアクセサ メソッドを想定)。

public int compare(MyClass a, MyClass b) {
    return a.getStartTime().compareTo(b.getStartTime());
}

そして、そこに行きます!MyClassオブジェクトを開始時間の昇順でソートする独自のコンパレータを定義しました。すでに持っているものと同様に、優先キューで使用できます。

Comparator<MyClass> comparator = new MyComparator();
PriorityQueue<MyClass> arrival = new PriorityQueue<MyClass>(10, comparator);
于 2012-10-16T14:58:17.540 に答える