ほとんどの人にとって、「行列」という言葉は、ほとんど楽しい連想を思い起こさせません。しかし、今日は別のキュー、つまり Java キューについて話します。Java では、キューはQueueインターフェイスを継承し、さらにCollectionインターフェイスを拡張したものです。つまり、キューはコレクションのように扱うことができます。
Java のキューは、 FIFOとLIFOという 2 つの動作原則をサポートします。
通常のキューはFIFO (先入れ先出し) の原則に基づいて制御されます。キューに追加された最初の要素が最初にキューから出ます。
LIFO (後入れ先出し) 原則はスタックの動作を説明します。キューに最後に追加された要素が最初にキューから出ます。たとえば、これはトランプの操作方法です。デッキの一番下に到達するまで、カードを一番上から 1 枚ずつ取り除きます。
Java のキュー階層は次のようになります。
ここでは、 Queue にLinkedList、ArrayDeque、およびPriorityQueueの 3 つの実装クラスがあることがわかります。LinkedListとArrayDeque はQueueではなくDeque を直接継承します。
Dequeは、Java 6 で追加されたインターフェイスです。これには、キューに役立ついくつかのメソッドが含まれており、キューを両端 (または双方向) キューとして機能させることができます。つまり、FIFOとLIFO。
Dequeインターフェースの 2 つの子孫のうちの 1 つはArrayDequeです。両端のキューをサポートしており、両端から要素を挿入および削除できます。これは、サイズが自動的に増加する動的配列でもあります。
Queueの直接の子孫であるPriorityQueueクラスもあります。これはDequeを実装するクラスとは異なる動作をします。
PriorityQueue は、デフォルトで自然な順序に従って要素を編成する優先キューです。ここでの並べ替えにはComparableインターフェイスとComparatorインターフェイスが使用されます。原理はTreeSetまたはTreeMapと同じです。これらのクラスはComparableインターフェイスを使用し、独自の並べ替え順序を持ちます。
PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));
priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
この例を実行すると、コンソールに次のように表示されます。
・ジョン
・アンドリュー
通常のコレクションではなくキューを操作しているため、リストから要素を削除する必要があります。これを行うには、次の構造を使用します。
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
DequeインターフェイスはQueueメソッドを継承し、独自の興味深いメソッドをいくつか追加します。
void addFirst(E obj) | obj要素をキューの先頭に追加します |
void addLast(E obj) | obj要素をキューの最後に追加します |
E getFirst() | キューから最初の要素を返します |
E getLast() | キューから最後の要素を返します |
ブール値 offerFirst(E obj) | obj要素をキューの先頭に追加し、要素が追加された場合はtrueを返します。それ以外の場合は、falseを返します。 |
ブール値 OfferLast(E obj) | obj要素をキューの最後に追加し、要素が追加された場合はtrueを返します。それ以外の場合は、falseを返します。 |
えー() | キューから最初の要素を取得して削除します |
void Push(E obj) | obj要素をキューの先頭に追加します |
E ピークファースト() | キューから最初の要素を返します (ただし、削除はしません)。 |
E ピークラスト() | キューから最後の要素を返します (ただし、削除はしません)。 |
EpollFirst() | 最初の要素を返し、キューから削除します。要素がない場合はnullを返します。 |
EpollLast() | キューから最後の要素を返し、削除します。要素がない場合はnullを返します。 |
EremoveLast() | キューの最初の要素を返して削除します。要素がない場合は例外をスローします。 |
EremoveFirst() | キューの最後の要素を返して削除します。要素がない場合は例外をスローします。 |
ブール値のremoveFirstOccurrence(オブジェクトobj) | 最初に出現したobjをキューから削除します |
ブール値のremoveLastOccurrence(オブジェクトobj) | 最後に出現したobjをキューから削除します |
それでは、これらの方法のいくつかを実際に見てみましょう。
まず、キューに要素を追加しましょう。
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple"); // Adds "Apple" to the end of the queue
deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue
System.out.println(deque);
次に、キューから値を取得しましょう。
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
System.out.println("The first element is: "+ deque.getFirst());
System.out.println("The last element is: " + deque.getLast());
}
このコードは、キューの最初と最後の要素を表示します。
最後の要素: パイナップル
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
deque.add("Lemon");
System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue
System.out.println(deque);
このコードを実行すると、次の結果が得られます。
アップル
[パイナップル、レモン]
Pop()とpoll()の違いは、リストが空の場合、pop() はNoSuchElementExceptionをスローしますが、 poll() はnullを返すことです。
次に、 pollFirst()メソッドとpollLast()メソッドについて考えます。
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
deque.add("Lemon");
System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
レモン
[アップル、パインアップル]
どちらのメソッドもキューから値を返し、キューから値を削除します。
以下は、 peekFirst()メソッドとPeakLast()メソッドの使用例です。
Deque<String> friends = new ArrayDeque<>();
friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");
System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());
System.out.println(friends);
最後の要素: オリバー
[ジョン、ロブ、グレッグ、マックス、オリバー]
どちらのメソッドもキューから最初/最後の要素を返し、削除しません。キューが空の場合はnullが返されます。
素晴らしい!今日は Java でキューを操作する方法を学びました。これで、実際にそれらを使用する方法がわかりました。
GO TO FULL VERSION