java - PriorityQueue 元素未排序

标签 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);
    }
}

我尝试使用列表执行此操作,然后调用 Collections.sort(listToSort) 并且它有效。我以为PriorityQueue的头部总是最小的元素?

最佳答案

来自文档,

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

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

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

希望这有帮助!!

关于java - PriorityQueue 元素未排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23289760/

相关文章:

java - 如何从 SoapObject 获取 byte[]

java - 投票系统存在逻辑问题

Java - Arrays.sort 返回 0

java - 为什么Collection接口(interface)有equals()和hashCode()?

java - 管理集合映射的通用方法

java - 当数据来自服务器时,如何使 ListView 每 5 秒刷新一次

java - 在 Android map 应用程序中更改 map 类型

c - 难以理解归并排序的特定 C 实现

c# - SortedList/SortedDictionary 奇怪的行为

java - 方法时间计算