PriorityQueueの続き

私が使いたかったQueueは、普段は単なるQueueとして動作しているが、優先度の高い要素を追加した場合は、その要素が優先的に取り出されるというものです。
このような物を実現する以上、登録する要素から優先度を決定する必要があるのは仕方ありません。インタフェースを設定する必要があります。しかし、なるべく手をかけたくないので、優先度の設定されていない要素に対してはこのインタフェースを実装する必要をなくしたい。このためComparableではなく、Comparatorで実現することにする。
あと、普段どうりのQueueとしても使用できることを考えると、登録順を優先度の要素の一部に取り入れる必要がある。この登録順をどのように取得するかを以下のように考えた。

  • 独自のQueueで実現
  • 追加する要素で実現
  • 予め登録順を取得し、要素に設定してからQueueに登録する。
  • Comparator

独自のQueueで実現する方法は、要素の登録時に登録順を取得し、それをもとに内部で保持するQueue実装に渡す独自のQueueを実装するほうほう。しかし、実装がめんどくさそう。
追加する要素で実現する方法は、Comparableを実装していないので難しい。
予め登録順を取得する方法は、そのロジックを毎回書かなければならない(Wrapperを作ってしまうと、最初の独自Queueと同じものになる)。
このため、Comparatorで比較する時にすることにした。登録した要素が2つ以上であれば、必ず比較されるので(ここで、インタフェースには定義されていないが、メソッドの最初の引数が登録が早いものとする。PriorityQueueは確認した)。
で、登録順はタイムスタンプではなくカウンターで実現する。タイムスタンプは同じ時間になることもあるし、カウンターの方が処理軽いだろ。
あと、同期はしないことにする。同期が必要であればBlockingQueueを使用すると思うし、Comparatorを起動するときに同期するでしょう(PriorityBlockingQueueは確認した)。
最後に、優先度について整理する。

  • Queueは、優先度を取得できる要素と、取得できない要素を操作することが出来る。
  • 優先度を取得できる要素は、Priorityインタフェースを実装し、そこに定義されたメソッドで優先度を取得できる。
  • 優先度を取得できない要素(Priorityインタフェースを実装しない要素)は、優先度を取得できる要素よりも低い優先度とする。
  • 優先度は以下の順番とする。
  1. Priorityを実装していて、優先度が高いオブジェクト。
  2. Priorityを実装していて、優先度が低いオブジェクト。
  3. Priorityを実装していないオブジェクト。
  • 上記の優先度が等しい要素同士の優先度は、先に登録された要素が高い。

疲れたので、実装はまた今度。
#文章を書くのは時間がかかるのぉ〜