2016-09-19 54 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方法不同的順序。