【问题标题】:how to set priority in priority queue [duplicate]如何在优先级队列中设置优先级[重复]
【发布时间】:2016-05-26 20:15:53
【问题描述】:

我正在学习 Java 并尝试学习集合中的优先级队列。我在一个网站上尝试了以下示例:

import java.util.*;    
class S
{
    public static void main(String args[])
    {
        PriorityQueue<String> queue=new PriorityQueue<String>();
        queue.add("Amit");
        queue.add("Vijay");
        queue.add("Karan");
        queue.add("Rahul");
        queue.add("Jai");

        System.out.println("iterating the queue elements:");
        Iterator<String> itr=queue.iterator();
        while(itr.hasNext())
        {
            System.out.println(itr.next());
        }
    }
}

结果如下:

Amit
Jai
Karan
Vijay
Rahul`

我期待的结果是:

Amit
Vijay
Karan
Rahul
Jai

我无法理解结果与我的预期有何不同,以及使用了何种类型的正常或默认优先级。
如果我想获得与预期相同的结果,我应该如何使用 prioiryqueue?

请帮助我。

这里我想知道优先级队列中默认排序的确切原因。

【问题讨论】:

  • 您需要使用比较器对数据进行排序。

标签: java


【解决方案1】:

引用PriorityQueue的javadoc:

iterator() 方法中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。

如您所见,PriorityQueue 的顺序在使用 iterator() 时并不重要。现在,如果您开始使用poll() 从队列中取值,您将按字典顺序获取值,即String 的自然顺序。

如果您想要一个按插入顺序返回项目的队列,请使用常规的 Queue 实现,例如 LinkedList 或 ArrayDeque。

【讨论】:

  • 还有一件事..根据我的问题,我在 Eclipse 中检查了调试,队列显示的元素顺序与迭代器显示的元素顺序相同。我也试图理解字典,但仍然无法理解它是如何插入默认排序的。
  • @SumitKumarAgarwal 对于PriorityQueue,排序(默认或其他)适用于poll() 和remove(),不适用于iterator()。 Eclipse 使用toString() 进行显示,内部使用iterator()。 Eclipse 还显示了名为 queue 的后备数组,它是平衡二叉树的平面表示,这也解释了奇怪的迭代顺序。
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多