【プログラミングしてみよう71】JavaのPriorityQueueの使い方

Java

前回はデータ構造入門として二分探索木を学びました。

今回は「PriorityQueue(優先度付きキュー)」について解説します。

PriorityQueueとは

通常のキューは「先入れ先出し(FIFO)」ですが、PriorityQueueは優先度が高い要素から取り出されるキューです。数値なら小さい順(デフォルト)、Comparatorを指定すれば任意の順序で取り出せます。

サンプルコード

ファイル作成

「Java59」フォルダに PriorityQueueTest.java という名前でファイルを作成します

コード入力

import java.util.Comparator;
import java.util.PriorityQueue;

public class PriorityQueueTest {
    record Task(String name, int priority) {}

    public static void main(String[] args) {
        // デフォルト: 数値の小さい順(最小ヒープ)
        PriorityQueue<Integer> minPQ = new PriorityQueue<>();
        minPQ.offer(5);
        minPQ.offer(1);
        minPQ.offer(3);
        minPQ.offer(2);

        System.out.print("最小順: ");
        while (!minPQ.isEmpty()) {
            System.out.print(minPQ.poll() + " ");
        }
        System.out.println();

        // 数値の大きい順(最大ヒープ)
        PriorityQueue<Integer> maxPQ = new PriorityQueue<>(Comparator.reverseOrder());
        maxPQ.offer(5);
        maxPQ.offer(1);
        maxPQ.offer(3);
        maxPQ.offer(2);

        System.out.print("最大順: ");
        while (!maxPQ.isEmpty()) {
            System.out.print(maxPQ.poll() + " ");
        }
        System.out.println();

        // 実用例: タスクの優先度管理
        System.out.println("\n--- タスク優先度管理 ---");
        PriorityQueue<Task> taskQueue = new PriorityQueue<>(
            Comparator.comparingInt(Task::priority).reversed()
        );

        taskQueue.offer(new Task("バグ修正",   3));
        taskQueue.offer(new Task("機能追加",   1));
        taskQueue.offer(new Task("緊急障害対応", 5));
        taskQueue.offer(new Task("ドキュメント", 2));
        taskQueue.offer(new Task("コードレビュー", 4));

        System.out.println("優先度が高い順に処理:");
        while (!taskQueue.isEmpty()) {
            Task t = taskQueue.poll();
            System.out.println("優先度" + t.priority() + ": " + t.name());
        }
    }
}

コンパイル

javac PriorityQueueTest.java

実行

java PriorityQueueTest

実行結果は次のようになります。

最小順: 1 2 3 5 
最大順: 5 3 2 1 

--- タスク優先度管理 ---
優先度が高い順に処理:
優先度5: 緊急障害対応
優先度4: コードレビュー
優先度3: バグ修正
優先度2: ドキュメント
優先度1: 機能追加

まとめ

PriorityQueueを使うことで、優先度の高い要素から順に取り出せるキューが実現できます。デフォルトは最小順、Comparator.reverseOrder() で最大順、カスタム Comparator で独自の優先度も指定できます。タスク管理・経路探索(ダイクストラ法)・スケジューリングなど幅広い場面で活躍します。

2026/08/19(水) ぱんまる

コメント

タイトルとURLをコピーしました