2016-09-19 20 views
0

我的程序正常工作,直到我查出几个项目然后添加进来,有时我的报价方法将项目放在队列的前面的后面。我已经添加了几条打印语句,以便可以看到队列中发生了什么。尝试优先级队列和我的报价方法是不把项目放在最后

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] 

最后一行是我的问题,提出在一号线的3号线前面。 感谢帮助:)

回答

2

查看PriorityQueue的Javadoc:

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

println(q)呼叫toString()AbstractCollection,它使用iterator()继承的,因此打印队列将列出以任意顺序的元件。

Polling已订购。迭代不是。

+0

虽然我实际上不希望它排序,但我希望我的项目按外观顺序附加。如果我误解了我的道歉 –

+0

如果您只是希望* all *元素按外观顺序排列,包括轮询时,请使用常规队列,例如'ArrayDeque'。 – Andreas

+0

好吧,我明白了,所以我应该在查看和投票之前对它进行排序? –

1

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

不,在peek/poll之前不需要或不需要进行排序。它将始终从PriorityQueue中返回正确的项目。

参照甲骨文JDK源代码,PriorityQueuetoString()方法在内部使用iterator()方法打印的PriorityQueue内容。作为@Andreas指出,

因为迭代器()不能保证遍历优先级队列中的元素在任何特定的顺序,你看到的是从你看到什么,如果你调用偷看/ poll方法不同的顺序。