请帮我理解一些事情
我开始用
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 :(得分:2)
来自Javadoc
“方法迭代器()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray) ())。“
您还可以逐个poll
元素以获得正确的顺序。
答案 1 :(得分:0)
也许您需要检查SomeEventComparatorByTime
中的逻辑或覆盖SomeEvent类和Implements Comparable中的方法compareTo
在这种情况下,您不需要使用比较器
只是说
private Queue future = new PriorityQueue();