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

时间:2013-08-21 11:14:34

标签: 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());
    }
}

它编译但在主题“主要” java.lang.ClassCastException: kinga cannot be cast to java.lang.Double中给了我例外。

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

4 个答案:

答案 0 :(得分:9)

kinga应与kinga相媲美,而不是Double,因此:

class kinga implements Comparable<kinga>

表示您的compareTo方法必须更改为:

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

答案 1 :(得分:8)

class kinga implements Comparable<Double>

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

应该是

class Kinga implements Comparable<Kinga>

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

compareTo方法应为

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

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

答案 2 :(得分:2)

PriorityQueue<kinga>Comparable<kinga>方法中的add。相反,传递Comparable<Dobule>会抛出ClassCastException

答案 3 :(得分:0)

Can somebody tell me how comparable and priority queues work?

首先在Comparable和Comparator接口之间获取difference

现在针对您的问题,您可以执行以下操作

首先为Kinga

创建比较器
class comparableKinga implements Comparator<kinga> {

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

然后在构造函数

中使用此Comparator创建优先级队列
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}