PriorityQueue元素未订购

时间:2014-04-25 09:53:32

标签: java sorting collections queue priority-queue

为什么输出不按升序排列?

public class Test {

    public static void main(String[] args) {
        PriorityQueue<Edge> edges = new PriorityQueue<Edge>();
        edges.add(new Edge(1, 2, 23));
        edges.add(new Edge(2, 3, 1000));
        edges.add(new Edge(1, 3, 43));

        Iterator<Edge> i = edges.iterator();
        while (i.hasNext())
            System.out.println(i.next());
    }


}

class Edge  implements Comparable<Edge> {
    private int v1;
    private int v2;
    private int w; 

    Edge(int v1, int v2, int w) {
        this.v1 = v1;
        this.v2 = v2;
        this.w = w;
    }

    public int getV1() {
        return v1;
    }


    public int getV2() {
        return v2;
    }

    public int getW() {
        return w;
    }

    @Override
    public int compareTo(Edge o) {
        return this.w - o.getW();
    }

    public String toString() {
        return ("v1: " + v1 + " v2: " + v2 + " w: " + w);
    }
}

我尝试使用List执行此操作,然后调用Collections.sort(listToSort)并且它可以正常工作。我认为PriorityQueue的头部总是最不重要的元素?

3 个答案:

答案 0 :(得分:1)

来自docs,

此类及其迭代器实现Collection和Iterator接口的所有可选方法。方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用Arrays.sort(pq.toArray()).

请注意,此实现未同步。如果任何线程修改队列,则多个线程不应同时访问PriorityQueue实例。而是使用线程安全的PriorityBlockingQueue类。

正如@Alejandro Lucena所说,所以尝试使用toArray()方法

希望这会有所帮助!!

答案 1 :(得分:0)

来自JavaDoc:

  

返回此队列中元素的迭代器。迭代器的确如此   不按任何特定顺序返回元素。

答案 2 :(得分:0)

我发现问题是通过poll()方法获取元素来解决的,该方法类似于dequeue。

PriorityQueue<Edge> edges = new PriorityQueue<Edge>();
edges.add(new Edge(1, 2, 23));
edges.add(new Edge(2, 3, 1000));
edges.add(new Edge(1, 3, 43));

Edge temp;
while ((temp = edges.poll()) != null) 
 System.out.println(temp);

这个工作的原因是因为poll()返回PriorityQueue的头部,它是最小的元素,而迭代器只是按照它们添加到队列的方式返回元素。