Java优先级队列和可比接口

Java优先级队列和可比接口,java,priority-queue,comparable,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) {

我刚刚学习了优先级队列,并想尝试一下它在类似接口中的行为

代码片段:

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());
    }
}
import java.util.PriorityQueue;
类实现了可比较的{
双倍时间=909.909;
双d;
公共国王a(双a){
这个d=a;
}
公共整数比较(双d){
返回双精度。比较(d,时间);
}
公共静态void main(字符串arg[]){
PriorityQueue r=新的PriorityQueue();
r、 增加(新kinga(4545.45));
r、 增加(新kinga(45.4));
r、 增加(新kinga(1235.45));
System.out.println(r.poll()+“”+r.poll()+“”+r.poll());
}
}
它进行编译,但在线程“main”
java.lang.ClassCastException中给了我异常:kinga不能转换为java.lang.Double


这里出了什么问题。有人能告诉我可比队列和优先级队列是如何工作的吗?

kinga
应该与
kinga
可比,而不是
Double
,因此:

class kinga implements Comparable<kinga>
PriorityQueue
将在
add
方法中使用
compariable
。相反,传递一个
可比较的
是抛出
ClassCastException

class kinga implements Comparable<Double>
这意味着:如果我的
d
比另一个国王的
d
大,我就比另一个国王大

Can somebody tell me how comparable and priority queues work?
首先获取可比较和比较器接口之间的数据

现在,对于你的问题,你可以做如下的事情

首先为Kinga创建一个比较器

class comparableKinga implements Comparator<kinga> {

@Override
public int compare(kinga o1, kinga o2) {
    return Double.compare(o1.getD(),o2.getD());
}
}

@JBNizet我不确定,原来是
Double.compare(d,time),所以我没有改变,但这没有任何意义。你们能看看我在这个问题中使用的优先级队列吗?顺便说一下,<代码> PrimyReals可能是牺牲安全性的另一个例子:如果它被声明为“代码>类优先级队列,那么这个错误会在编译时被捕获,但是只有自然排序的元素才能被放入队列+1来驱动它回家,考虑<代码> Kinga k;双d。在这种情况下,
k.compareTo(d)工作正常,但“d.compareTo(k)”呢?优先级队列有时会调用后者,这就是导致异常的原因。有关编辑的代码和输出,请参见我的答案。您能看看我在这个问题中使用的优先级队列吗?
@Override
public int compareTo(Kinga other) {
    return Double.compare(this.d, other.d);
}
Can somebody tell me how comparable and priority queues work?
class comparableKinga implements Comparator<kinga> {

@Override
public int compare(kinga o1, kinga o2) {
    return Double.compare(o1.getD(),o2.getD());
}
}
class kinga {

double d;

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

public double getD() {
    return this.d;
}

@Override
public String toString() {
    return "kinga{" +
            "d=" + d +
            '}';
}

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


    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());
}
}
kinga{d=45.4} kinga{d=1235.45} kinga{d=4545.45}