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

整数数据如何插入优先级队列(序列无法撤消)[重复]

徐景明
2023-03-14

我正在学习收集框架中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]

这个顺序是如何安排的(这里的优先级是什么?)我不明白,因为它不是增加订单或减少订单。请指导

共有2个答案

栾昂雄
2023-03-14

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

晏沈义
2023-03-14

它存储为最小堆。了解有关最小堆的更多信息

 类似资料:
  • 我想通过数组的第二个元素[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]。我对优先级队列执行了哪些操作? 问候语