为什么Java中的PriorityQueue不能有initialCapacity 0?

Fix*_*int 5 java collections data-structures

PriorityQueue用于部分数据的部分排序.特别是,这是代码:

Collection<Data> data = ...;
PriorityQueue<Data> queue = new PriorityQueue<Data>(data.size(), dataComparator);
queue.addAll(data);
// iterate over queue with remove() until we have as much data as we need or until queue is empty
Run Code Online (Sandbox Code Playgroud)

不幸的是,当data集合为空时,代码失败,因为PriorityQueue无法作为initialCapacity传递零.这个设计决定背后的原因是什么?为什么不能有0大小PriorityQueue

UPD:我知道如何解决这个问题.我想知道为什么不在其中PriorityQueue包含这个max(1,n)代码 - 是否有任何原因或者它只是一个糟糕的API设计?

chi*_*oro 9

你为什么要使用队列?队列是一种数据结构,用于具有将项目排入队列的"生产者"和使其出列的"消费者"的情况.优先级队列使用树结构对排队的项目进行排序.生产者能够入队需要一个缓冲区,所以initialCapacity = 0毫无意义.

在您的情况下,永远不会排队任何东西,您只需处理您已有的集合中的数据.为什么要为它创建新的数据结构?你可以使用

for (Data item : Collections.sort(data, dataComparator)) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者,根据丹尼尔的评论,使用选择算法,这样你就可以从你的情况中获利,你实际上只需要你的一部分项目.

  • `PriorityQueue`javadoc明确地说`remove()`是`O(log(n))`.这意味着无论我是否知道我需要多少元素,检索第一个k将是O(k*log(n)),其优于O(n*log(n))用于排序. (2认同)