7

プライオリティ キューについて学習したばかりで、同等のインターフェイスでどのように動作するかを試してみようと思いました。

コードスニペット:

import java.util.PriorityQueue;

class kinga implements Comparable<Double> {
    double time=909.909;
    double d;

    public kinga(double a) {  
        this.d=a;
    }

    public int compareTo(Double d) {
        return Double.compare(d, time);
    }

    public static void main(String arg[]) {
        PriorityQueue<kinga> r=new PriorityQueue<kinga>();

        r.add( new kinga(4545.45));
        r.add( new kinga(45.4));
        r.add( new kinga(1235.45));

        System.out.println(r.poll()+" "+r.poll()+" "+r.poll());
    }
}

コンパイルされますが、スレッド "main" で例外が発生しますjava.lang.ClassCastException: kinga cannot be cast to java.lang.Double

ここで何が問題なのですか。比較可能なキューと優先キューがどのように機能するか教えてもらえますか?

4

4 に答える 4

9

kingakingaではなくと比較する必要があるDoubleため、次のようになります。

class kinga implements Comparable<kinga>

つまり、compareToメソッドを次のように変更する必要があります。

public int compareTo(kinga o) {
    return Double.compare(o.d, d);
}
于 2013-08-21T11:16:15.957 に答える
8
class kinga implements Comparable<Double>

それは意味がありません。あなたのクラスはDoubleとうまく比較できますが、Doubleはそれを認識しておらず、キンガのインスタンスとうまく比較できず、Comparableコントラクトが破られます。また、キンガは他のキンガと比較できないため、PriorityQueue<kinga>.

そのはず

class Kinga implements Comparable<Kinga>

(Java 命名規則を尊重するために大文字に注意してください)、つまり、Kinga インスタンスは互いに比較可能です。

compareTo メソッドは

@Override
public int compareTo(Kinga other) {
    return Double.compare(this.d, other.d);
}

dつまり、自分のキンガが他のキンガよりも大きい場合、私は別のキンガよりも大きいということですd

于 2013-08-21T11:17:42.600 に答える
2

PriorityQueue<kinga>メソッドで期待Comparable<kinga>され addます。代わりにa を渡すと、Comparable<Dobule>投げますClassCastException

于 2013-08-21T11:17:01.027 に答える