技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Javaの優先度付きキュー

Javaで複数条件でソートする。 - ITエンジニアの技術メモ
で扱った題材を優先度付きキュー PriorityQueue を使って実装してみた。

以下のような感じになる。

        Queue<Work> queue = new PriorityQueue(Comparator.
                comparing(Work::getReward, Comparator.reverseOrder()).
                thenComparing(Work::getTimeToFinish));
        queue.add(new Work(1, 3));
        queue.add(new Work(3, 8));
        queue.add(new Work(2, 6));
        queue.add(new Work(3, 7));
        queue.add(new Work(1, 4));
        queue.add(new Work(4, 6));

        while (true) {
            Work work = queue.poll();
            if (work == null) {
                break;
            }
            System.out.println("TimeToFinish: " + work.getTimeToFinish() + 
                    ", Reward: " + work.getReward());
        }
    }

実行結果は以下になる。(前記事と同じ結果)

TimeToFinish: 3, Reward: 8
TimeToFinish: 3, Reward: 7
TimeToFinish: 2, Reward: 6
TimeToFinish: 4, Reward: 6
TimeToFinish: 1, Reward: 4
TimeToFinish: 1, Reward: 3


なお、この PriorityQueue から要素を取り出す時に、iterator を使うと、意図した順番で取得できないので注意。
PriorityQueue (Java Platform SE 8)

iterator()メソッド内で提供されるIteratorでは、特定の順序で優先度キューの要素をトラバースすることは保証されません。