具有固定大小的 Java 优先级队列 MinMaxPriorityQueue, 谷歌番石榴

2022-08-31 21:02:08

我正在计算大量可能得到的算法组合。为了对这些组合进行排序,我用双精度值对它们进行评级,并将它们存储在PriorityQueue中。目前,该队列中大约有20万个项目,这几乎是内存密集型的。顺便说一句,我只需要说列表中所有项目中最好的1000或100。所以我开始问自己,是否有办法在Java中拥有一个大小固定的优先级队列。我应该这样表现:该项目是否比所有准备好存储的项目更好?如果是,则将其插入到相应的位置,并将评级最低的元素扔掉。

有人有想法吗?再次非常感谢!

马可


答案 1
que.add(d);
if (que.size() > YOUR_LIMIT)
     que.poll();

还是我错过了你的问题?

编辑:忘记提到,要使此功能起作用,您可能必须反转compariTo函数,因为它会丢弃每个周期具有最高优先级的函数。(如果 a 是 “更好” b 比较 (a, b) 应返回一个 positvie 数。

保持最大数字的示例使用如下内容:

public int compare(Double first, Double second) {
            // keep the biggest values
            return first > second ? 1 : -1;
        }

答案 2

MinMaxPriorityQueue, 谷歌番石榴

确实有一个用于维护队列的类,当添加超过集合最大大小的项目时,它会比较项目以查找要删除的项目,从而创建空间:从版本8开始,在Google Guava中找到的MinMaxPriorityQueue

驱逐队列

顺便说一句,如果您只想删除最旧的元素而不对对象的值进行任何比较,则Google Guava 15获得了EvictingQueue类。