前回はデータ構造入門として二分探索木を学びました。
今回は「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(水) ぱんまる


コメント