Java优先级队列和类似的接口

Joh*_*ter 7 java priority-queue comparable

我刚刚学习了优先级队列,并且认为我会尝试使用类似的界面来表现它.

代码片段:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

它编译但在线程"main"中 给出了Exception java.lang.ClassCastException: kinga cannot be cast to java.lang.Double.

这里有什么问题.有人能告诉我可比性和优先级队列的工作原理吗?

Kat*_*ona 9

kinga应该是可比的kinga,不是Double,所以:

class kinga implements Comparable<kinga>
Run Code Online (Sandbox Code Playgroud)

这意味着您的compareTo方法必须更改为:

public int compareTo(kinga o) {
    return Double.compare(o.d, d);
}
Run Code Online (Sandbox Code Playgroud)


JB *_*zet 8

class kinga implements Comparable<Double>
Run Code Online (Sandbox Code Playgroud)

这没有意义.虽然你的课程会与Double相提并论,但是Double并没有意识到这一点,并且不会与kinga的实例进行比较,这将打破可比较合同.而且由于一个王国无法与另一个王者相比,你不能使用PriorityQueue<kinga>.

它应该是

class Kinga implements Comparable<Kinga>
Run Code Online (Sandbox Code Playgroud)

(注意大写,以尊重Java命名约定),这意味着:Kinga实例是可比较的.

compareTo方法应该是

@Override
public int compareTo(Kinga other) {
    return Double.compare(this.d, other.d);
}
Run Code Online (Sandbox Code Playgroud)

这意味着:如果我d比其他Kinga更大,我比另一个Kinga 更大d.

  • +1要把它开回家,请考虑`Kinga k; 双d;`.在这种情况下,`k.compareTo(d);`工作正常,但是'd.compareTo(k)`怎么样?优先级队列有时会调用后者,这是导致异常的原因. (2认同)