Java PriorityQueue完全解説:基礎、操作、カスタムソート
Java PriorityQueue
JavaコレクションフレームワークのPriorityQueueクラスを、明確な例とベストプラクティスで解説します。
PriorityQueueクラスはヒープデータ構造を実装し、Queueインターフェースを満たします。挿入順ではなく優先度に基づいて要素を効率的に取得できます。

標準的なキューとは異なり、要素はソート順で返されます。昇順が必要な場合、キューのヘッドは最小の要素となり、以降の削除で次々と小さい値が取り出されます。内部的な順序は保証されませんが、取り出し順序はソートされます。
PriorityQueueの作成
java.util.PriorityQueueをインポートして始めます:
import java.util.PriorityQueue;
PriorityQueue<Integer> numbers = new PriorityQueue<>();
このデフォルト設定では自然順序付け(昇順)が使用されます。キュー作成時にComparatorを指定することで順序をカスタマイズできます。
PriorityQueueの主要メソッド
Queueインターフェースで定義されるすべてのメソッドに加え、いくつかのキュー固有の操作が利用可能です。
要素の挿入
add()- 要素を追加。キューが満杯の場合は例外をスロー。offer()- 要素を追加。キューが満杯の場合はfalseを返す。
例:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
System.out.println("PriorityQueue: " + numbers);
numbers.offer(1);
System.out.println("更新後のPriorityQueue: " + numbers);
}
}
出力
PriorityQueue: [2, 4] 更新後のPriorityQueue: [1, 4, 2]
4が2より先に追加されたにもかかわらず、2が最小要素であるためヘッドのままです。1を追加するとキューが再編成され、1がヘッドになります。
要素へのアクセス
peek()を使用して、要素を削除せずにヘッドを確認します:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
int number = numbers.peek();
System.out.println("アクセスされた要素: " + number);
}
}
出力
PriorityQueue: [1, 4, 2] アクセスされた要素: 1
要素の削除
remove()- 指定要素を削除。成功時はtrueを返す。poll()- ヘッドを取得して削除。
例:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
boolean result = numbers.remove(2);
System.out.println("要素2は削除されたか? " + result);
int number = numbers.poll();
System.out.println("poll()で削除された要素: " + number);
}
}
出力
PriorityQueue: [1, 4, 2] 要素2は削除されたか? true poll()で削除された要素: 1
PriorityQueueのイテレーション
iterator()でイテレーション(java.util.Iteratorが必要):
import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.print("PriorityQueue(iterator使用): ");
Iterator<Integer> iterate = numbers.iterator();
while (iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
出力
PriorityQueue(iterator使用): 1, 4, 2,
その他のメソッド
| メソッド | 説明 |
|---|---|
contains(element) | 要素がキューに存在すればtrueを返す |
size() | キューの要素数を返す |
toArray() | キューを配列に変換 |
Comparatorによるカスタムソート
自然順序を逆順にしたり、任意のカスタム優先度を実装するには、キュー作成時にComparatorを指定します:
import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
numbers.add(4);
numbers.add(2);
numbers.add(1);
numbers.add(3);
System.out.print("PriorityQueue: " + numbers);
}
}
class CustomComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return b.compareTo(a); // 逆順
}
}
出力
PriorityQueue: [4, 3, 1, 2]
カスタムComparatorにより、ヘッドが最大要素になります。詳細についてはJava Comparator APIを参照してください。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較