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時間でソートされたリストになります。この正確な割り当てが期待されます。

次に、(グループ2からの)さらに3つのイベントを同じキューに追加します。これらのイベントも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要素を1つずつ作成して、正しい順序を取得することもできます。

于 2013-03-25T18:10:54.743 に答える
0

たぶんあなたはSomeEventComparatorByTimeのロジックをチェックする必要があります

または、クラスSomeEventのメソッドcompareToをオーバーライドし、Comparableを実装します

この場合、コンパレータを使用する必要はありません

と言うだけ

プライベートキューfuture=new PriorityQueue();

于 2013-03-25T18:11:58.703 に答える