尝试优先队列和我的报价方法不是把项目放在最后

时间:2016-09-19 15:32:37

标签: java

我的程序工作正常,直到我查出几个项目然后加入,有时我的商品方法将一个项目放在队列的前面而不是后面。我已经添加了一些打印语句,因此可以看到队列中发生了什么。

import java.util.*;

public class PriorityQ {
   public static void main(String[] args) {
      Scanner s = new Scanner(System.in);
      PriorityQueue<String> q = new PriorityQueue<String>();
      String input = "";
      while (!input.equals("X")) {
         input = s.nextLine();
         if (input.equals("O") && q.peek() == null) {
            System.out.println("Buffer empty");
         }
         else if (!input.equals("O")) {   
            q.offer(input);
            System.out.println(q);
         }
         else if (q.peek() != null && input.equals("O")) {
            System.out.print("Data: ");
            System.out.printf("%s ", q.peek());
            q.poll();
            System.out.println();
            System.out.println(q);
         }
      }
   }
}

I / O如下:

line1
[line1]
line2
[line1, line2]
line3
[line1, line2, line3]
O
Data: line1 
[line2, line3]
O
Data: line2 
[line3]
line1
[line1, line3]

最后一行是我的问题,它将line1放在第3行的前面。 感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

阅读PriorityQueue的javadoc:

  

方法iterator()中提供的迭代器 not 保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用Arrays.sort(pq.toArray())

println(q)调用toString()继承自使用AbstractCollection的{​​{1}},因此打印队列将按任意顺序列出元素。

轮询已订购。迭代不是。

答案 1 :(得分:1)

  

所以我应该在偷看和投票之前对其进行排序?

在偷看/民意调查之前,没有必要或者不需要排序。它将始终从PriorityQueue返回正确的项目。

参考Oracle jdk源代码,toString()的{​​{1}}方法在内部使用PriorityQueue方法打印iterator()的内容。正如@Andreas指出的那样,

  

因为不保证iterator()不会以任何特定顺序遍历优先级队列的元素,所以您看到的顺序与调用peek / poll方法时所看到的顺序不同。