PriorityQueue

Tiger(Java5)で追加されたjava.util.PriorityQueueの動作をテストしていました。
PriorityQueueは優先度によって並べ替えられるQueueなので、つめる要素の優先度を比較する必要がある。これには2つ実現方法がある(と思う)。

  1. つめる要素にjava.lang.Comparableを実装させる。
  2. java.lang.Comparatorを実装したクラスのインスタンスをPriorityQueueに設定する。

#これをやらないとClassCastExceptionがでる
つめる要素にComparableを実装させるほうは、以下の理由で面倒と思った。

  • つめる要素のクラス全てが実装する必要がある(共通の抽象クラスを作成すれば良いかもしれない)。
  • 既存アプリケーションのQueueをPriorityQueueに変更するためには、Queueだけではなく、追加する要素のクラスも修正しなければならない。

そして、テストしてみました。そうすると、ちょっと嫌な動作を見つけました。
それは、優先度が同一の場合(Comparatorのcompareメソッドで0を返す場合)、先に取り出される要素が一定しないと言うこと。
自分で勝手に考えた動作は、優先度が同じ場合はQueueに先に追加したものが先に取り出されるというもの(だって、Queueだもん。←これが優先度で必要な条件か・・・)。
それをどのように実現すればよいのでしょうか?
今度書きます。