ほとんどの人にとって、「行列」という言葉は、ほとんど楽しい連想を思い起こさせません。しかし、今日は別のキュー、つまり Java キューについて話します。Java では、キューはQueueインターフェイスを継承し、さらにCollectionインターフェイスを拡張したものです。つまり、キューはコレクションのように扱うことができます。

Java のキューは、 FIFOLIFOという 2 つの動作原則をサポートします。

通常のキューはFIFO (先入れ先出し) の原則に基づいて制御されます。キューに追加された最初の要素が最初にキューから出ます

LIFO (後入れ先出し) 原則はスタックの動作を説明します。キューに最後に追加された要素が最初にキューから出ますたとえば、これはトランプの操作方法です。デッキの一番下に到達するまで、カードを一番上から 1 枚ずつ取り除きます。

Java のキュー階層は次のようになります

ここでは、 Queue にLinkedListArrayDeque、およびPriorityQueueの 3 つの実装クラスがあることがわかります。LinkedListArrayDeque はQueueではなくDeque を直接継承します。

Dequeは、Java 6 で追加されたインターフェイスです。これには、キューに役立ついくつかのメソッドが含まれており、キューを両端 (または双方向) キューとして機能させることができます。つまり、FIFOLIFO

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 でキューを操作する方法を学びました。これで、実際にそれらを使用する方法がわかりました。