工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java PriorityQueue完全解説:基礎、操作、カスタムソート

Java PriorityQueue

JavaコレクションフレームワークのPriorityQueueクラスを、明確な例とベストプラクティスで解説します。

PriorityQueueクラスはヒープデータ構造を実装し、Queueインターフェースを満たします。挿入順ではなく優先度に基づいて要素を効率的に取得できます。

Java PriorityQueue完全解説:基礎、操作、カスタムソート

標準的なキューとは異なり、要素はソート順で返されます。昇順が必要な場合、キューのヘッドは最小の要素となり、以降の削除で次々と小さい値が取り出されます。内部的な順序は保証されませんが、取り出し順序はソートされます。


PriorityQueueの作成

java.util.PriorityQueueをインポートして始めます:

import java.util.PriorityQueue;
PriorityQueue<Integer> numbers = new PriorityQueue<>();

このデフォルト設定では自然順序付け(昇順)が使用されます。キュー作成時にComparatorを指定することで順序をカスタマイズできます。


PriorityQueueの主要メソッド

Queueインターフェースで定義されるすべてのメソッドに加え、いくつかのキュー固有の操作が利用可能です。


要素の挿入

例:

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

要素の削除

例:

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

  1. Java演算子をマスター:種類、構文、実践例
  2. Javaコメント:種類、使い方、ベストプラクティス
  3. Java if…elseをマスター:制御フローを徹底解説
  4. Java拡張forループをマスター:構文、例、ベストプラクティス
  5. Java文字列をマスター:生成、メソッド、ベストプラクティス
  6. Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
  7. Java無名インナークラス完全ガイド:定義、構文、実践例
  8. Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
  9. Javaアノテーション完全ガイド:種類、配置場所、実践例
  10. Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
  11. Java Vectorの理解:使い方、特徴、ArrayListとの比較