在对Java的优先级队列进行排序时,需要进行说明

时间:2013-03-25 18:02:21

标签: java priority-queue

请帮我理解一些事情

我开始用

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);
    }

我错过了什么?

2 个答案:

答案 0 :(得分:2)

来自Javadoc

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

您还可以逐个poll元素以获得正确的顺序。

答案 1 :(得分:0)

也许您需要检查SomeEventComparatorByTime

中的逻辑

或覆盖SomeEvent类和Implements Comparable中的方法compareTo

在这种情况下,您不需要使用比较器

只是说

private Queue future = new PriorityQueue();