【问题标题】:Java : PriorityQueue queue results and natural orderingJava:PriorityQueue 队列结果和自然排序
【发布时间】:2014-06-18 07:26:20
【问题描述】:

我知道,队列遵循 FIFO(先进先出)顺序,但我不确定为什么下面的 java 示例程序会出现以下输出

JAVA 示例

  public static void main(String args[]) {
            Queue<String> q = new PriorityQueue<String>();
            q.add("3");
            q.add("1");
            q.add("2");

            Iterator<String> itr = q.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next() + "    ");
            }
}

输出:

1    
3    
2   

根据java.util.PriorityQueue.PriorityQueue()的Java文档

Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering.
  • Q1) 谁能解释一下为什么输出是 1 3 2 以及如何 自然秩序在这里起作用。

  • Q2) 我检查了自然排序及其与 可比/可比,但它们不是为了 仅排序(升序/降序)顺序??

【问题讨论】:

  • 对不起!初始示例使用LinkedList。现在更新Java 示例使用PriorityQueue

标签: java collections queue


【解决方案1】:

Java 中的 PriorityQueue 是一种数据结构,用于对其包含的元素进行排序。摘自Javadoc

优先级队列的元素按照它们的自然顺序排序,或者由队列构建时提供的 Comparator 排序,具体取决于使用的构造函数。

无序输出的问题来自于迭代器的实现。另一个摘录,这次来自iterator() 方法:

返回此队列中元素的迭代器。迭代器不会以任何特定顺序返回元素。

因此,您不必使用迭代器来确定固定顺序。如果您在循环中使用poll() 方法,您将按升序获取所有给定元素。

如果您正在寻找 FIFO 意义上的队列,您可以查看 LinkedList 并仅使用 addFirst()getLast() 方法。

【讨论】:

  • 有点奇怪! Iterator 在遍历 ArrayList 时返回相同的顺序,但对于 PriorityQueue 它不会:(
  • 是的,非常不直观。 JavaDoc 的另一个提示:您可以使用Arrays.sort(q.toArray()) 来创建一个包含元素的有序数组。
  • 只是在这里更新,即使您使用q.toArray(),它也会以自然顺序返回Object[]。所以这里不需要额外的Arrays.sort 方法。
  • 保证? JavaDoc 声明 Returns an array containing all of the elements in this queue. The elements are in no particular order. 也许您的值在每个“事故”中都有正确的顺序?
  • 是的!我刚刚执行了以下测试并遍历对象数组并以排序方式返回元素Object[] ob=(Object[]) q.toArray(); for(int i=0;i&lt;q.size();i++) System.out.println(ob[i]);
猜你喜欢
  • 2012-11-20
  • 2012-08-27
  • 1970-01-01
  • 2018-05-15
  • 2014-10-29
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多