Java PriorityQueueクラス:初心者のガイド

はじめに

こんにちは、未来のJavaプログラマーたち!今日は、JavaのPriorityQueueの素晴らしい世界に飛び込んでいきましょう。まだ聞いたことがないという方も心配しないでください —— 一から始めて一緒に上達していきます。PriorityQueueを特別な種類の列(またはキュー)と考えてください。そこでは、最も重要な人(またはアイテム)が常に最初に行くのです。興奮していませんか?それでは、始めましょう!

Java - PriorityQueue

クラス宣言

Javaでは、PriorityQueueクラスはJava Collections Frameworkの一部です。これは、データのVIPリストのようなものです!以下がその宣言方法です:

import java.util.PriorityQueue;

PriorityQueue<ElementType> pq = new PriorityQueue<>();

ElementTypeは、Integer、String、または独自のカスタムオブジェクトなど、保存したいデータの型に置き換えてください。

パラメータ

PriorityQueueを作成する際に、いくつかのオプションのパラメータを指定することができます:

  1. 初期キャパシティ:最初に保持できるアイテムの数。
  2. コンパレータ:要素の順序を決定する特別なオブジェクト。

以下がその例です:

PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());

これは、最初に10個の整数を保持できるPriorityQueueを作成し、それらが高い順から低い順に並べられます。

クラスコンストラクタ

PriorityQueueにはいくつかのコンストラクタがあります。コンストラクタは、キューを作成するための異なるレシピと考えてください。以下が主要なものです:

コンストラクタ 説明
PriorityQueue() デフォルトの初期キャパシティ(11)で空のキューを作成
PriorityQueue(int initialCapacity) 指定された初期キャパシティで空のキューを作成
PriorityQueue(Comparator<? super E> comparator) 指定されたコンパレータで空のキューを作成
PriorityQueue(Collection<? extends E> c) 指定されたコレクション内の要素を含むキューを作成

以下がその例です:

PriorityQueue<String> fruitQueue = new PriorityQueue<>();
PriorityQueue<Integer> numberQueue = new PriorityQueue<>(20);

最初の行では、文字列(おそらく果物の名前?)用のキューを作成しています。二行目では、最初に20個のアイテムを保持できる数値用のキューを作成しています。

クラスメソッド

さて、PriorityQueueでできる素晴らしいことをいくつか見ていきましょう:

メソッド 説明
add(E e) キューに要素を追加
offer(E e) キューに要素を追加(満杯の場合はfalseを返す)
peek() キューの先頭を取得しますが、削除しません
poll() キューの先頭を取得し、削除します
remove(Object o) 指定された要素の単一のインスタンスを削除
size() キュー内の要素の数を返す
clear() キューからすべての要素を削除

以下がこれらの動作を示す例です:

PriorityQueue<String> animalQueue = new PriorityQueue<>();

animalQueue.add("Dog");
animalQueue.offer("Cat");
animalQueue.add("Elephant");

System.out.println("Peek: " + animalQueue.peek()); // 出力:Peek: Cat
System.out.println("Poll: " + animalQueue.poll()); // 出力:Poll: Cat
System.out.println("Size: " + animalQueue.size()); // 出力:Size: 2

どうして「Cat」が最初に来るか気づきましたか?それは、PriorityQueueがデフォルトで文字列をアルファベット順にソートするからです。

継承されたメソッド

PriorityQueueは、親クラスからメソッドを継承しています。それは、ボーナス機能を得るのに似ています!いくつかの便利なものには以下があります:

  • contains(Object o): キューに指定された要素が含まれているかどうかを確認
  • toArray(): キュー内のすべての要素を含む配列を返す
  • iterator(): キュー内の要素に対するイテレータを返す

以下がその簡単な例です:

PriorityQueue<Integer> numberQueue = new PriorityQueue<>();
numberQueue.add(5);
numberQueue.add(2);
numberQueue.add(8);

System.out.println("Contains 2? " + numberQueue.contains(2)); // 出力:Contains 2? true

Object[] array = numberQueue.toArray();
System.out.println("First element: " + array[0]); // 出力:First element: 2

プライオリティキューにアイテムを追加する例

それでは、これらすべてを一つの楽しい例でまとめましょう。パーティーを開く際に、ゲストの到着時間順でゲストを迎え入れたいと想象してみてください:

import java.util.PriorityQueue;

public class PartyGreeter {
public static void main(String[] args) {
PriorityQueue<Guest> guestQueue = new PriorityQueue<>();

guestQueue.add(new Guest("Alice", 18.30));
guestQueue.add(new Guest("Bob", 18.15));
guestQueue.add(new Guest("Charlie", 18.45));

while (!guestQueue.isEmpty()) {
Guest guest = guestQueue.poll();
System.out.println("Welcome, " + guest.name + "! You arrived at " + guest.arrivalTime);
}
}

static class Guest implements Comparable<Guest> {
String name;
double arrivalTime;

Guest(String name, double arrivalTime) {
this.name = name;
this.arrivalTime = arrivalTime;
}

@Override
public int compareTo(Guest other) {
return Double.compare(this.arrivalTime, other.arrivalTime);
}
}
}

このプログラムは以下を出力します:

Welcome, Bob! You arrived at 18.15
Welcome, Alice! You arrived at 18.3
Welcome, Charlie! You arrived at 18.45

この例では、カスタムのGuestクラスを作成し、Javaにゲストの到着時間に基づいてゲストを比較する方法を教えました。PriorityQueueは自動的にゲストを並べ替えてくれました!

それでは、JavaのPriorityQueueの世界に踏み入れたことをお祝いしましょう!これからも练习を続けることで完璧になりますので、恐れずにこれらのコンセプトを実験してみてください。誰しもが、次のパーティーのゲストリストを整理するのにPriorityQueueを使うかもしれませんよ!

Credits: Image by storyset