PriorityQueue Java
JavaでPriorityQueueを使用する方法
優先度付きキューは、プログラミングで使用され、データ構造を作成します。データ構造では、値が最も高いデータのアイテムを最初に構造で処理する必要があります。
Javaでコーディングしているときに、優先キューを実装したいという状況に遭遇する可能性があります。そこでJavaQueueインターフェースが登場します。ただし、Queueはインターフェースであるため、コードに直接実装することはできません。ヒープデータ構造を使用して優先度付きキューを作成する場合は、代わりにPriorityQueueを使用することをお勧めします。
このチュートリアルでは、JavaでのPriorityQueueの基本について説明し、キューを作成する方法について説明します。このチュートリアルでは、キューの内容を取得および操作するために使用できるPriorityQueueが提供する主な方法についても説明します。
JavaキューとPriorityQueues
キューは、スタックと同様に、操作が実行される特定の順序を持つデータ構造です。キューの場合、操作は先入れ先出し(FIFO)の順序で実行されます。これは、リストの最初のアイテムが常に最初のアイテムになることを意味します。キューは、要素が挿入されるときに要素の順序で並べ替えられます。
あなたがレストランにいて、注文したとします。最も公正なアプローチであるため、各顧客が食べ物を注文した順に提供されることをお勧めします。したがって、ジャックの後に食べ物を注文した場合は、ジャックの直後に提供されることをお勧めします。これはキューの例です。
このチュートリアルでは、Javaで優先度付きキューを作成するために使用されるQueueインターフェースのPriorityQueue実装に焦点を当てます。
PriorityQueuesは、要素が優先度に基づいて並べ替えられるタイプのキューです。つまり、値が5と10のキューでは、最後に追加された場合でも、常に10がキューの先頭になります。
優先キューを作成する
Javaで優先キューを作成するには、最初にjava.util.PriorityQueue
をインポートする必要があります。 パッケージ。このパッケージには、キューの作成に使用できるPriorityQueueメソッドが含まれています。次のコードを使用してPriorityQueueパッケージをインポートできます:
参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。
平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。
import java.util.PriorityQueue;
PriorityQueueをインポートしたので、パッケージを使用してキューを作成できます。 PriorityQueueの作成に使用される構文は次のとおりです。
PriorityQueue<DataType> queue_name = new PriorityQueue<>();
これを分解してみましょう:
- PriorityQueue プログラムに優先キューを作成するように指示します。
- データ型 キューに保存されるデータの種類です。
- queue_name 作成するキューに割り当てられる変数の名前です。
- new PriorityQueue(); 優先キューを初期化します。
それで、私たちのレストランで顧客の注文を格納するキューを作成したいとします。各顧客のテーブル番号をキューに格納する必要があります。このスタックは、次のコードを使用して作成できます。
PriorityQueue<Integer> orders = new PriorityQueue<>();
この例では、orders
というPriorityQueueのインスタンスを作成しました。 整数値を格納します。キューでは、FIFOデータ構造を使用して要素にアクセスして削除します。
PriorityQueueにアイテムを追加
Javaでは、キュー内の各要素はitem
と呼ばれます 。
アイテムをキューに追加するには、add()
を使用できます 方法。このメソッドは、キューに追加するアイテムの値という1つのパラメーターを受け入れます。キューがいっぱいの場合、add()
メソッドは例外を返します。
さらに、offer()
を使用できます アイテムをキューに追加するメソッド。 add()
の違い およびoffer()
そのoffer()
キューがいっぱいの場合はfalseを返しますが、add()
例外をスローします。
ランチを注文したばかりなので、テーブル#22と#17をこの順序でスタックに追加するとします。このコードを使用してこれを行うことができます:
import java.util.PriorityQueue; class AddCustomer { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); System.println("Orders: " + orders); orders.offer(17); System.out.println("Updated orders: " + orders); } }
コードは次のようになります:
Orders: [22] Updated orders: [22, 17]
例を分解してみましょう。まず、PriorityQueueクラスをインポートしました。これは、後でコードで使用します。次に、この例のコードを格納するAddCustomerというクラスを宣言しました。クラス内のコードは次のように機能します。
-
new PriorityQueue<>();
を使用しますorders
という優先キューを作成します 。 -
add()
を使用します テーブル#22をスタックに追加する方法。 -
Orders:
という単語を印刷します 続いて、スタックの内容をコンソールに送信します。 -
offer()
を使用します テーブル#17をスタックに追加する方法。 -
Updated orders:
という用語を印刷します 続いて、コンソールへのスタックの改訂された内容が続きます。
22はスタックの最初に表示されるため、要素を削除すると最初に表示されます。つまり、テーブル#22はスタックの一番上にあります。表#17は、スタックの2番目の位置に格納されています。優先キューはFIFOの順序で並べられていることを忘れないでください。
このコードは、元の注文の配列を返し、次に更新された注文の配列を返します。
PriorityQueueからアイテムを削除
PriorityQueueからアイテムを削除するために使用できる2つの方法があります:
-
remove()
キューから要素の単一のインスタンスを削除します。 -
poll()
キューから最初の要素を削除し、削除されたアイテムを返します。
スーシェフが注文#17を処理し、スタックから削除したいとします。その注文が処理された後、シェフは注文#22を準備し、スタックから削除したいと考えています。
注文番号17はスタックの位置2にあり、注文番号22は位置1にあります。これらのアイテムをこの順序で削除します。このコードを使用して注文を削除できます:
import java.util.PriorityQueue; class RemoveOrders { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); boolean removed = orders.remove(2); System.out.println("Was order #17 removed?" + removed); int second_removed = orders.poll(); System.out.println("Order #" + second_removed + " was removed from the queue."); } }
コードは次のようになります:
Was order #17 removed? true Order #22 was removed from the queue.
コードを分解してみましょう。まず、remove()
を使用しました スタックの位置2の注文を削除するメソッド。これにより注文番号17が削除されました。
次に、コードは、Was order #17 removed?
というメッセージを出力しました。 その後にremove()
の結果が続きます 方法。 remove()
スタックから#17が正常に削除されたため、メソッドはtrueを返しました。
次に、poll()
を使用しました スタックの一番上のアイテムを削除するメソッド。この場合、それは注文番号22でした。 poll()
注文番号22を削除し、削除されたアイテムを返品しました。アイテムが削除された後、メッセージOrder #[order number removed] was removed from the queue.
を出力しました。 コンソールに。
アイテムの取得
peek()
メソッドは、キューアイテムの先頭(キューの最初のアイテム)を取得するために使用されます。スーシェフが新しい注文を引き受ける準備ができているので、スタック内の次の注文の値を知りたいとします。
このコードを使用して、次の列にいる顧客のテーブル番号を取得できます。
import java.util.PriorityQueue; class RetrieveOrder { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); int next_order = orders.peek(); System.out.println("The next order to be processed is table #" + next_order + "."); } }
コードは次のようになります:
The next order to be processed is table #22.
スタックの最初のアイテムは22なので、peek()
を使用すると メソッドの場合、プログラムは値22を返します。コードの最後の行に、The next order to be processed is table #[number of first order in stack].
というメッセージを出力します。 、スタックの最初の注文の番号がpeek()
によって検出された場合 。
優先キューを反復処理する
多くの場合、キューを操作するときは、優先キューの要素に対してイテレータを作成する必要があります。
これを行うには、iterator()
を使用できます java.util.Iteratorパッケージの一部であるメソッド。ただし、iterator()
を使用する前に メソッドでは、最初に次のコードを使用してIteratorパッケージをインポートする必要があります:
import java.util.Iterator;
レストランの注文のキューにあるすべてのアイテムのリストをコンソールに出力したいとします。このコードを使用してこれを行うことができます:
import java.util.PriorityQueue; import java.util.Iterator; class PrintOrders { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); orders.add(14); orders.add(19); Iterator<Integer> iterate = orders.iterator(); while(iterate.hasNext()) { System.out.println(iterate.next()); } } }
コードは次のようになります:
22 17 14 19
このコードでは、最初に4つの値をキューに追加します。次に、iterator()
を使用します 優先キュー内のすべてのアイテムを処理するために使用できるイテレーターを作成するメソッド。次に、while
を作成します イテレータ内のすべてのアイテムを実行するループ— orders
内のすべてのアイテムに対して キュー—キュー内の次の値を出力します。
追加のPriorityQueueメソッド
PriorityQueueクラスでよく使用されるメソッドがさらに3つあります。これらは次のとおりです。
メソッド名 | 説明 |
size() | キューの長さを返します。 |
toArray() | キューを配列に変換します。 |
contains(elementName) | キューで要素を検索します。 |
結論
PriorityQueueクラスは、JavaでQueueインターフェースを実装するために使用されます。キューはFIFOデータ構造を使用するため、最初に入力されたアイテムが最初に出力されます。
このチュートリアルでは、JavaのキューとPriorityQueuesの基本について説明しました。また、キューを作成する方法と、キューからアイテムを取得して操作するために使用できる主な方法についても説明しました。
これで、プロのようにJavaPriorityQueueクラスの使用を開始するために必要なツールが手に入りました。
-
SwingはJavaでスレッドセーフですか?
いいえ、 Java Swing コンポーネントはJavaではスレッドセーフではありません。 Swingコンポーネントがスレッドセーフではない理由 Java Swingがスレッドセーフではない主な理由の1つは、そのコンポーネントを拡張するタスクを簡素化することです。 Java Swingのもう1つの理由は、ロックの取得と解放、および状態の復元に伴うオーバーヘッドのため、スレッドセーフではありません。 。 一部のJavaSwingコンポーネントメソッドは、 repaint()、revalidate()などのマルチスレッドアクセスをサポートします。 、および invalidate()メソッド
-
Javaのインターフェース
インターフェースはJavaの参照型です。クラスに似ています。これは、抽象的なメソッドのコレクションです。クラスはインターフェースを実装し、それによってインターフェースの抽象メソッドを継承します。 インターフェイスには、抽象メソッドに加えて、定数、デフォルトメソッド、静的メソッド、およびネストされた型も含まれる場合があります。メソッド本体は、デフォルトのメソッドと静的メソッドにのみ存在します。 インターフェイスの作成は、クラスの作成に似ています。ただし、クラスはオブジェクトの属性と動作を記述します。また、インターフェースには、クラスが実装する動作が含まれています。 インターフェイスを実装す