English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基础教程

Java プロセス制御

Java 配列

Java 面向オブジェクト(I)

Java 面向オブジェクト(II)

Java 面向オブジェクト(III)

Java 異常処理

Java リスト(List)

Java Queue(キュー)

Java Mapコレクション

Java Setコレクション

Java 入出力(I/O)

Java Reader/Writer

Java その他のトピック

Java PriorityQueue

このチュートリアルでは、PriorityQueueクラスを学ぶためにJavaコレクションフレームワークの例を使用します。

PriorityQueueクラスはヒープデータ構造の機能を提供します。

これを実現していますQueueインターフェース

通常のキューとは異なり、優先キューの要素はソート順に検索されます。

要素を昇順で検索したいと仮定します。その場合、優先キューの先頭は最小の要素です。その要素を検索した後、次に小さい要素がキューの先頭になります。

注意すべきことは、優先キューの要素はソートされていない可能性があります。しかし、要素は常にソート順に検索されます。

PriorityQueueを作成

为了创建优先级队列,我们必须导入java.util.PriorityQueueパッケージ。パッケージをインポートした後、以下の方法を使用してJavaで優先順位キューを生成できます。

PriorityQueue<Integer> numbers = new PriorityQueue<>();

这里,我们创建了一个没有任何参数的优先级队列。在这种情况下,优先级队列的头是队列中最小的元素。元素将按升序从队列中移除。

但是,我们可以借助Comparator接口自定义元素的顺序。我们将在本教程的后面部分中对此进行了解。

PriorityQueue方法

PriorityQueue类提供了Queue接口中存在的所有方法的实现。

将元素插入PriorityQueue

  • add() - 将指定的元素插入队列。如果队列已满,则会引发异常。

  • offer() - 将指定的元素插入队列。如果队列已满,则返回false。

例如,

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //创建优先队列
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        //使用add()方法
        numbers.add(4);
        numbers.add(2);
        System.out.println("PriorityQueue: ") + numbers);}}
        //使用offer()方法
        numbers.offer(1);
        System.out.println("更新后的PriorityQueue: ") + numbers);}}
    }
}

出力結果

PriorityQueue: [2, 4]
更新后的PriorityQueue: [1, 4, 2]

在这里,我们创建了一个名为numbers的优先级队列。我们已将4和2插入队列。

虽然4被插入到2之前,但队列的头是2。这是因为优先级队列的头是队列中最小的元素。

然后,我们将1插入队列。 现在重新排列了队列,以将最小的元素1存储到队列的开头。

访问PriorityQueue元素

要从优先级队列访问元素,我们可以使用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);}}
        //使用 peek() 方法
        int number = numbers.peek();
        System.out.println("访问元素: ") + number);
    }
}

出力結果

PriorityQueue: [1, 4, 2]
访问元素: 1

删除PriorityQueue元素

  • remove() - 从队列中删除指定的元素

  • 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);}}
        //使用remove()方法
        boolean result = numbers.remove(2);
        System.out.println("元素2是否已删除? " + result);
        //使用poll()方法
        int number = numbers.poll();
        System.out.println("使用poll()删除的元素: ") + number);
    }
}

出力結果

PriorityQueue: [1, 4, 2]
要素2削除済みですか? true
poll()を使用して削除された要素: 1

優先順位キューを巡回します

優先順位キューの要素を巡回するには、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("使用iterator()でPriorityQueueを巡回します: ");
        //iterator()メソッドを使用します
        Iterator<Integer> iterate = numbers.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

出力結果

iterator()を使用してPriorityQueueを巡回します: 1, 4, 2,

優先順位キューの他のメソッド

メソッド内容説明
contains(element)優先順位キューで指定された要素を検索します。要素が見つかった場合、trueを返し、見つからなかった場合、falseを返します。
size()優先順位キューの長さを返します。
toArray()優先順位キューを配列に変換し、それを返します。

優先順位キュー比較器(comparator)

上記のすべての例では、優先順位キューの要素は自然順序(昇順)で取得されます。しかし、この順序をカスタマイズできます。

このため、独自の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 number1, Integer number2) {
        int value =  number1.compareTo(number2);
        //要素は逆の順序で並べ替えられます
        if (value > 0) {
            return -1;
        }
        else if (value < 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

出力結果

PriorityQueue: [4, 3, 1, 2]

上記の例では、CustomComparatorクラスをパラメータとして渡して優先順位キューを作成しました。

CustomComparatorクラスはComparatorインターフェースを実装しています。

その後、compare()メソッドをオーバーライドします。このメソッドは今や要素のヘッドが最大の数になります。