我编写了一个自定义比较器来比较我的节点类,但是java优先级队列没有以正确的顺序返回我的项目。
这是我的比较器:
public int compare(Node n1, Node n2){
if (n1.getF() > n2.getF()){
return +1;
}
else if (n1.getF() < n2.getF()){
return -1;
}
else { // equal
return 0;
}
}
其中getF返回double。但是,在将多个节点插入优先级队列后,我使用以下方法打印出来:
while(open.size() > 0) {
Node t = (Node)(open.remove());
System.out.println(t.getF());
}
结果是:
6.830951894845301
6.830951894845301
6.0
6.0
5.242640687119285
7.4031242374328485
7.4031242374328485
8.071067811865476
为什么会这样?我的比较器错了吗?感谢。
麦克
答案 0 :(得分:9)
你是如何打印出这些价值的?我不认为来自PriorityQueue
的迭代器提供了整体类所做的相同的排序保证,所以如果你正在做的那么可能
for(Node n : queue) {
System.out.println(n.getF());
}
你将获得无序输出。订购保证仅适用于offer
,take
,poll
,peek
以及其他一些方法。
javadocs中优先级队列http://java.sun.com/javase/6/docs/api/java/util/PriorityQueue.html
的迭代器特别值得一提答案 1 :(得分:4)
不知道你的代码有什么问题,但这对我有用:
import java.util.*;
public class Test {
public static void main(String[] args) {
PriorityQueue<Node> open = new PriorityQueue<Node>(10,
new Comparator<Node>() {
@Override
public int compare(Node n1, Node n2){
if (n1.getF() > n2.getF()){
return +1;
}
else if (n1.getF() < n2.getF()){
return -1;
}
else { // equal
return 0;
}
}
});
for (int i = 0; i < 20; i++)
open.add(new Node());
while(open.size() > 0) {
Node t = (Node)(open.remove());
System.out.println(t.getF());
}
}
}
class Node {
double d = Math.random() * 10;
public double getF() { return d; }
}
输出:
0.21442281608773262
1.9965384843480016
2.6660026888929824
2.888889937975976
3.098932914222398
3.1059072964534638
4.193212975907516
4.296282412431935
4.3241392173963735
4.825876226139123
5.193550353435191
5.637831708672641
5.949759449054407
6.620639629878806
7.505126870725806
7.966337123623846
8.270840212631589
8.484502118941545
8.730910327480023
9.191324325662219
确保getF()
不会意外地返回双重版本的int版本。
更新:您无法在插入后更新定义元素顺序的数据。在这种情况下,您需要提取元素,更新它,然后重新插入。