2013-01-18 110 views
1

我正在對隊列類型做一個包裝,但每次添加元素時,我都想對所有內容進行排序。大部分將是整數。我對Collections框架不太熟悉,有沒有簡單的解決方案?Java:排序隊列

public class Round<Type> { 

    private Queue<Type> qe; 

    public Round(){ 
     this.qe = new LinkedList<Type>(); 
    } 


    public void push(Type p){ 
     this.qe.offer(p); 
     //Collections.sort(this.qe); Here I want to sort this 
    } 


    public Type pop(){ 
     return this.qe.poll(); 
    } 
} 

回答

8

你確定這是你想要的嗎?

每次添加元素時對所有內容進行排序似乎並不明智。

也許你真的想要PriorityQueue

如果每次添加一個元素時,都要重新排列整個元素,那麼必須非常小心,不要因爲插入操作而導致複雜性...這非常糟糕。

取決於用於支持隊列的實際數據結構,您可以做得比這更好,但它依賴於底層實現,我不建議這樣做。

優先級隊列允許在O(log(n))時間內進行排隊和出隊,這對於必須隨機插入的結構來說非常有效。

+0

沒錯。或者根據排序順序在適當的位置手動插入 –

+0

是的,我建議有點反對,因爲它取決於底層的數據結構,它可以在沒有通知的情況下更改。 – pcalcao

+0

謝謝,我完全忘了'PriorityQueue'。這正是我需要的。 – ashur

4

隊列不會被排序。我會建議你寧願使用LinkedList或ArrayList。然後,在排序後,您可以通過從前端出隊併入隊排隊來模擬隊列式行爲。

或者,您可以使用組合並創建一個SortableQueue,您可以在其中使用List作爲基礎結構,然後添加排序行爲。

但是,它似乎是你想要使用PriorityQueue。優先級隊列根據某種排序對其內容進行排序,並按照該順序保留隊列。它比使用一個列表並且每次使用一個堆作爲它的支持數據結構進行排序都快得多。

喜歡的東西:

PriorityQueue<Integer> q = new PriorityQueue<Integer>(); 
q.add(6); 
q.add(2); 
q.add(9); 

Dequeing以上將導致2 6 9。我認爲這是你想要的。您也可以添加自己的比較器以特定方式對對象進行排序。

+1

這也是有幫助的,謝謝! – ashur

7

您應該實現自己的Comparator接口並使用PriorityQueue。

每次添加元素時,您的隊列都會保持排序狀態。

喜歡的東西:

private Queue<Type> qe = new PriorityQueue<Type>(20, new MyComparator<Type>())