当前位置: 首页 > 知识库问答 >
问题:

如何利用优先级队列将arraylist转换为Java最大堆

齐冥夜
2023-03-14

我知道我们可以使用collections.reverseOrder()创建一个使用优先级队列的max堆,但是我还需要在那个地方传递ArrayList。我试图创建一个自定义比较器以防万一,但它似乎不起作用。我想知道这样做的确切语法。
示例/我的知识:
1)创建一个空的最小堆->PriorityQueue pqmin=new PriorityQueue();
2)从一个ArrayList创建一个最小堆arr->PriorityQueue pqmin=new PriorityQueue(arr);
3)创建一个空的最大堆->PriorityQueue pqmax=new PriorityQueue(Collections.ReverseOrder());

我的问题:如何使用Java中的priorityQueue从现有的arrayList创建最大堆

共有2个答案

桓深
2023-03-14

使用3),然后AddAll。或者更好的方法是传递初始容量

 PriorityQueue pqmax = new PriorityQueue(arr.size(), Collections.reverseOrder()); 
 pqmax.addAll(arr);
越伟泽
2023-03-14

priorityqueue中没有这样的构造函数,它同时接受集合和比较器。

但您可以使用AddAll方法:

PriorityQueue pqmax = new PriorityQueue(Collections.reverseOrder());
pqmax.addAll(arr);
 类似资料:
  • 我试图在Java中实现一个稳定的(先进先出)优先级队列。假设键是一个名称,值是一个年龄,我知道我可以像这样制作一个不稳定的优先级队列: 这几乎完成了我需要它做的所有事情,除了它在我插入(或移除)键值对时不保持它们的顺序。 编辑: 感谢你在第一条评论中提出的好问题。我所说的FIFO是指对于具有相等值的键值对,首先放入的键值对应该首先被提取。

  • 我定义最大优先级队列如下: 我需要理解这是如何工作的,特别是当1只得到2的索引(而不是4)时? 多谢了。

  • 我一直在通过互联网进行广泛的搜索,寻找某种类型的答案来解决我的问题,但我没有运气找到任何可以帮助我的东西。基本上,我想知道的是是否可以将双精度转换为密钥,然后将其插入到优先级队列中。 这就是我正在努力使用的方法,它来自一个文件名。就是这个: 文件中的 insert 方法如下所示: 这是的插入方法.java 它们是相同的。现在问题出现了,因为来自.java不能更改。我必须接受一个双精度,然后将该双精

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 我目前正在尝试实现min heap PQ,但是我在实现的正确性方面遇到了一些问题,我似乎无法找出我做错了什么——它没有输出最低优先级,也没有对它们进行正确排序。 使用以下测试数据: 我得到以下结果: 我希望结果是按升序排列的——起初我认为这可能是因为交换了错误的孩子,但最后一个输出是最大的优先级,所以这没有意义。我花了几个小时试图研究堆优先级队列,但我找不到任何帮助。 以下是CMP要求的更好的代码