- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 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/
我应该传递什么值来为 N 个项目创建一个基于 HashMap/HashMap 的高效结构? 在 ArrayList 中,有效数字是 N(N 已经假设 future 增长)。 HashMap 的参数应该
当从一个集合构造一个HashSet和一个LinkedHashSet时,initialCapacity在默认实现中被设置为不同的值。 哈希集: public HashSet(Collection c)
HashMap的构造函数 /** * Constructs an empty HashMap with the specified initial * capacity and load fact
java.util.concurrent.ConcurrentHashMap的构造方法之一: public ConcurrentHashMap(int initialCapacity) {
我想知道为什么 LinkedList 没有 initialCapacity。 我知道何时使用 ArrayList 以及何时使用 LinkedList。 定义集合最终大小的良好做法如下: List ar
我使用 PriorityQueue 对某些数据进行部分排序。特别是,这是代码: Collection data = ...; PriorityQueue queue = new PriorityQue
在ArrayList.java中,为什么ArrayList(int initialCapacity)构造函数调用super()? 我知道它正在尝试调用其父类(super class)的默认构造函数,即
我必须从一个数组(在下面的代码中称为 nums)构造一个最大堆,所以我使用 java.util.PriorityQueue。 我的代码是这样的: PriorityQueue pq = new Prio
我正在处理排序 interval存在于 ArrayList 上及其 start属性,完整定义 interval将在示例代码中显示为私有(private)类。 我使用的实现是 MergeSort , 与
我是一名优秀的程序员,十分优秀!