我使用 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
不幸的是,当 data
集合为空时,代码失败,因为 PriorityQueue
不能作为 initialCapacity 传递零。这个设计决定背后的原因是什么?为什么不能有一个 0 大小的 PriorityQueue
?
UPD:我知道如何解决这个问题。我想知道为什么 PriorityQueue
不在其中包含此 max(1, n) 代码 - 有任何原因还是只是糟糕的 API 设计?
最佳答案
为什么要使用队列?队列是一种数据结构,适用于您有一个将项目排入队列的“生产者”和一个使它们出队的“消费者”的情况。优先队列使用树结构对排队的项目进行排序。生产者需要一个缓冲区才能入队,因此 initialCapacity = 0
没有意义。
在您的情况下您从不排队任何东西,您只是处理您已有的集合中的数据。为什么要为它创建一个新的数据结构?你可以只使用
for (Data item : Collections.sort(data, dataComparator)) {
// ...
}
或者,根据 Daniel 的评论,使用 Selection Algorithm这样您就可以从实际上只需要一部分商品的情况中获益。
关于java - 为什么 Java 中的 PriorityQueue 不能有 initialCapacity 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3609342/