今日は実装を書いてみます。
package priorityQueue;
/**
* 優先度を取得するインタフェース。
* @see PriorityAndTimeComparator
*/
public interface Priority {
int getPriority();
}
おしまい。
じゃなくて、引き続き、
- PriorityAndTimeComparatorクラス
package priorityQueue;
import java.util.Comparator;
import java.util.Map;
import java.util.WeakHashMap;
/**
* 優先度と登録順で優先順を決定するComparatorです。<br>
* 優先度は以下の順番になります。
* <ol>
* <li>Priorityを実装していて、優先度が高いオブジェクト。</li>
* <li>Priorityを実装していて、優先度が低いオブジェクト。</li>
* <li>Priorityを実装していないオブジェクト。</li>
* </ol>
* 上記の優先度が等しい場合は、登録された順に優先度が高くなります。
* @see Priority
*/
public class PriorityAndTimeComparator implements Comparator
クラス名にセンスが感じられない。
#昔からの仕様です。
このクラスはMapのkeyでメモリリークしないようにWeakHashMapを使っています。しかし、Queueに登録する要素にStringを渡した場合、GC対象になってくれません(手元のお手軽テストでは)。Stringって、キャッシュしているんだっけ?なんかそんな話を引いたことがあるような気がするんだけど。そのキャッシュがいつかはGC対象になってくれるのであれば良いが、なってくれないのであればStringのWrapperを作ったほうが良いのかも。
でも、普通Stringなんてつめないか・・・解決しました。
#これとSequenceable...を組み合わせれば・・・面白いものが出来るかなとつぶやいてみる。