1

请帮我理解一些事情

我从一个

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

请问我错过了什么?

4

2 回答 2

2

来自Javadoc

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

您还可以poll将元素一一获得正确的顺序。

于 2013-03-25T18:10:54.743 回答
0

也许您需要检查 SomeEventComparatorByTime 中的逻辑

或者重写 SomeEvent 类中的 compareTo 方法并实现 Comparable

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

只是说

私有队列未来 = new PriorityQueue();

于 2013-03-25T18:11:58.703 回答