2013-03-25 70 views
1

請幫助我瞭解的東西Java的優先級隊列排序,澄清需要

我開始用

private Queue<SomeEvent> future = 
     new PriorityQueue(CAPACITY, new SomeEventComparatorByTime()); 

我再加入5個事件(從第1組)到隊列,其中每個事件從10:49:00開始。

ScheduledEvent{ userId='group_1_uid1'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid2'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid3'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid4'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid5'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 

然後我通過一些簡單的邏輯斷點事件減2,增加時間如下。此打印輸出顯示隊列的當前內容。

ScheduledEvent{ userId='group_1_uid1'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid2'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid3'} { startTime=3/31/2013 10:50:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid4'} { startTime=3/31/2013 10:50:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid5'} { startTime=3/31/2013 10:51:00, repeat=RUN_ONCE } 

最後,我結束了按時間排序的SomeEvent列表。預計這種精確的分配。

然後我再添加3個事件(從組2)到相同的隊列。這些事件也開始在10點49分00秒

後,我添加事件要排隊,我得到:

ScheduledEvent{ userId='group_1_uid1'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid2'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_2_uid4'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_2_uid6'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid5'} { startTime=3/31/2013 10:51:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid3'} { startTime=3/31/2013 10:50:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_2_uid5'} { startTime=3/31/2013 10:49:00, repeat=RUN_ONCE } 
ScheduledEvent{ userId='group_1_uid4'} { startTime=3/31/2013 10:50:00, repeat=RUN_ONCE } 

注意順序......這裏沒有排序。爲什麼?我認爲,隨着新元素被添加到隊列中,它的位置是由比較器決定的

for (SomeEvent e : group.getEvents()) { 
     future.offer(e); 
    } 

我在想什麼?

+0

你如何得到PriorityQueue的當前內容?一個接一個地彈出元素,或者試圖獲取當前隊列狀態的轉儲? – MAK 2013-03-25 18:06:23

+0

從javadoc中,「方法迭代器()中提供的迭代器不能保證以任何特定順序遍歷優先級隊列的元素。」你每次使用一個'Iterator'? – 2013-03-25 18:06:49

回答

2

從法迭代器(提供)Javadoc

「迭代器保證穿越任何特定順序的優先級隊列中的元素。如果您需要按順序遍歷,請考慮使用Arrays.sort( pq.toArray())「。

您還可以poll的元素一一得到正確的順序。

+0

非常感謝。我確實忽視了這一點。 – JAM 2013-03-25 18:11:15

0

也許你需要檢查邏輯SomeEventComparatorByTime

或者類SomeEvent覆蓋的方法的compareTo並實現可比

在這種情況下,你不需要使用比較

,只是說

private Queue future = new PriorityQueue();