我正在学习收集框架中Java的优先级队列。
目前我的主题是优先级队列。我参考了下面的文章和这个视频来学习,然后在IDE上测试了代码
int ar[] = {3, 5, 12, 9, 1};
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int f:ar)
pq.add(f);
当我打印pq时,我得到[1,3,12,9,5]
这个顺序是如何安排的(这里的优先级是什么?)我不明白,因为它不是增加订单或减少订单。请指导
PriorityQueue
以自然顺序存储元素,除非在创建队列时提供了比较器。
int ar[] = {3, 5, 12, 9, 1};
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int f:ar)
pq.add(f);
System.out.println(pq);
结果是
[1, 3, 12, 9, 5]
astoString
在打印队列时调用AbstractCollection
类的方法。
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
这里使用的迭代器()是在PriorityQueue类中实现的,它不会以任何特定的顺序返回元素。因此,当您打印优先级队列时,它会无顺序地打印元素。
/**
* Returns an iterator over the elements in this queue. The iterator
* does not return the elements in any particular order.
*
* @return an iterator over the elements in this queue
*/
public Iterator<E> iterator() {
return new Itr();
}
如果要知道队列中存储的元素的顺序,必须轮询元素并打印它们。
int ar[] = {3, 5, 12, 9, 1};
PriorityQueue<Integer> pq = new PriorityQueue<>(ar.length);
for(int f:ar)
pq.add(f);
while(!pq.isEmpty())
System.out.println(pq.poll());
这将按照元素的存储顺序为您提供元素。
1
3
5
9
12
它存储为最小堆。了解有关最小堆的更多信息
我想通过数组的第二个元素[0,30],[5,10],[15,20]进行比较。 但我得到一个错误如下 第8行:错误:需要数组,但找到了对象PriorityQueue ^2个错误
我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[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] 我定义的比较器有什么问题吗?提前感谢你的帮助。
我定义最大优先级队列如下: 我需要理解这是如何工作的,特别是当1只得到2的索引(而不是4)时? 多谢了。
我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。
一般来说,如果我理解正确的话,在给定列表和添加每个元素之间的“heapizing;o(n)”运行时是有区别的;o(lg n)。java遵循这种行为吗?如果不是,下面的问题可能无效。 下面的示例似乎创建了一个"min-heap"。 然而,假设我想构建一个“最大堆”,但是构造函数不允许我同时传入集合和比较器。在这种情况下,构建最大堆的唯一方法是创建一个实现可比的包装器类吗? 注意:我知道可以用比较器创
我试图实现Prim的算法Java优先级队列。 我找不到我的错误我只是认识到队列没有正确地排列节点。 图表示例: 它始终将节点 4 作为第二个节点。因此,它对队列进行排序,如 [node1, node4, node2, node3],而不是 [node1,node2, node3, node4]。我对优先级队列执行了哪些操作? 问候语