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

kinga应该与kinga, not相比较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 并没有意识到这一点,并且不会与 kinga 的实例进行比较,这将违反 Comparable 合同。而且由于 kinga 无法与另一个 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 的大,我就比另一个 Kinga 大d

于 2013-08-21T11:17:42.600 回答
2

PriorityQueue<kinga>将期望Comparable<kinga>add方法中。传递 aComparable<Dobule>相反,正在抛出ClassCastException

于 2013-08-21T11:17:01.027 回答
-1
Can somebody tell me how comparable and priority queues work?

首先了解Comparable 和 Comparator 接口之间的区别。

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

首先为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}
于 2013-08-21T11:37:08.457 回答