想不出比将整个集合复制到另一个集合并使用 poll 方法更好的方法来打印 toString 与 PQ,自然有序。
还有其他建议吗?
想不出比将整个集合复制到另一个集合并使用 poll 方法更好的方法来打印 toString 与 PQ,自然有序。
还有其他建议吗?
如果您需要 PriorityQueue 完全排序后的顺序,则需要将其复制到 TreeSet 之类的排序集合
例如
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 的最大长度。
您需要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]