PriorityQueue \ java

时间:2012-09-13 10:49:54

标签: java arrays collections priority-queue

无法考虑使用PQ打印toString更好的方式,自然有序,而不是将整个集合复制到另一个集合,并使用poll方法。

还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

如果你需要订单,如果它完全排序,则需要将PriorityQeue复制到一个Sorted集合,如TreeSet

e.g。

System.out.println(new TreeSet(pq)); // prints elements naturally sorted.

注意:这将丢弃重复项,而PriorityQueue则不会。


即使排序为O(n * log n)且打印为O(n)这也不是全部。在内存中排序要比使用任何IO快得多,这意味着您需要一个非常大的队列来使排序更加重要。

public static void main(String... args) {
    PriorityQueue<Double> pq = new PriorityQueue<Double>();
    for (int i = 0; i < 10*1000 * 1000; i++)
        pq.add(Math.random());
    long start1 = System.nanoTime();
    Set<Double> set = new TreeSet<Double>(pq);
    long time1 = System.nanoTime() - start1;

    long start2 = System.nanoTime();
    for (Double d : set) {
        System.out.println(d);
    }
    long time2 = System.nanoTime() - start2;
    System.out.printf("It took %.3f seconds to sort, and %.3f seconds to print %,d doubles%n", time1 / 1e9, time2 / 1e9, pq.size());
}

在最后打印

It took 28.359 seconds to sort, and 94.844 seconds to print 10,000,000 doubles

如果我使用数组并对其进行排序

Double[] doubles = pq.toArray(new Double[pq.size()]);
Arrays.sort(doubles);

It took 8.377 seconds to sort ....

简而言之,在队列长到足以排序为最重要的队列之前,您可能会耗尽内存或超过String的最大长度。

答案 1 :(得分:0)

您需要覆盖要在任何集合中添加的对象中的toString()方法,然后toString方法正常

    PriorityQueue<String> priorityQueue = new PriorityQueue<String>();
    priorityQueue.add("one");
    priorityQueue.add("two");
    priorityQueue.add("three");
    System.out.println(priorityQueue);//Prints [one, two, three]