我刚刚学习了优先级队列,并且认为我会尝试使用类似的界面来表现它。
代码段:
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
中给了我例外。
这里有什么问题。有人能告诉我可比性和优先队列的工作原理吗?
答案 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}