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

标签 java data-structures collections

我使用 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/

相关文章:

java - 如何将 Map<Integer, List> 转换为 List

c++ - map /设置迭代器不可递增,我无法从头开始重新启动 map

java - Collections.synchronizedCollection 的 forEach 和 removeIf 中可能存在错误?

java - 如何为中间相遇攻击收集数据?

java - @NotEmpty 不显示自定义异常消息

java - 如何创建 Restful 服务并将其部署到 OSGi 容器中?

c - 删除堆栈给定索引处的元素,该索引是堆栈链表的一部分

haskell - Haskell 中的 Data.IntMap 与 Data.Sequence(Haskell 集合)

java - 为什么解析的 Double 行为不正确?

java - Hazelcast Delta 更新