6

我编写了一个自定义比较器来比较我的节点类,但是 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 返回一个双精度值。然而,在将几个节点插入优先级队列后,我使用以下命令将它们打印出来:

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

任何想法为什么会这样?我的比较器错了吗?谢谢。

麦克风

4

2 回答 2

10

你是如何打印出这些值的?我不认为迭代器 fromPriorityQueue提供与整个类相同的排序保证,所以如果你正在做

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

于 2010-06-15T19:59:36.113 回答
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()不会意外返回 double 的 int 版本。


更新:您不能更新定义插入后元素顺序的数据。在这种情况下,您需要提取元素、更新它并重新插入它。

于 2010-06-15T20:02:17.783 回答