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}