1. 概要

このクイックチュートリアルでは、ApacheCommonsCollectionsライブラリcollections4.queueパッケージで提供されるCircularFifoQueueデータ構造を確認します。

CircularFifoQueue を実装しますインターフェイスであり、 固定サイズ ノンブロッキングキュー いっぱいになっているキューに要素を追加すると、新しい要素のためのスペースを作るために最も古い要素が削除されます

2. Mavenの依存関係

Mavenプロジェクトの場合、必要な依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

このライブラリの最新バージョンは、 MavenCentralにあります。

3. コンストラクター

CircularFifoQueue オブジェクトを作成するには、デフォルトのコンストラクターを使用できます。これにより、デフォルトのサイズが32のキューが作成されます。

CircularFifoQueue<String> bits = new CircularFifoQueue();

キューの目的の最大サイズがわかっている場合は、intを引数として取るコンストラクターを使用してサイズを指定できます。

CircularFifoQueue<String> colors = new CircularFifoQueue<>(5);

コンストラクターに引数としてコレクションを指定することにより、CircularFifoQueueオブジェクトを作成するオプションもあります。

この場合、キューはコレクションの要素でいっぱいになり、そのサイズはコレクションのサイズと同じになります。

CircularFifoQueue<String> daysOfWeek = new CircularFifoQueue<>(days);

注:このキューは作成時にすでにいっぱいになっているため、追加すると最初に作成された要素が破棄されます。

4. 要素の追加

他のQueue実装と同様に、addおよびofferメソッドを使用して要素を追加できます。 Queue JavaDoc は、offerメソッドが容量制限のあるキューで操作するときに使用されることを意図していることを指定します。

ただし、 CircularFifoQueue は非ブロッキングであるため、挿入が失敗することはありません。 その結果、そのaddメソッドとofferメソッドは同じ動作を示します。

addメソッドを使用してcolorsキューに要素を追加する方法を見てみましょう。

colors.add("Red");
colors.add("Blue");
colors.add("Green");

そして、offerメソッドを使用していくつかの要素を追加しましょう。

colors.offer("White");
colors.offer("Black");

5. 要素の削除と取得

CircularFifoQueue クラスは、キューの要素を操作する必要がある場合に役立ついくつかのメソッドを提供します。 一部のメソッドは、キューから要素を取得するために使用され、一部は要素を削除するために使用され、一部は両方の操作を同時に実行するために使用されます。

5.1. ピークメソッド

peek メソッドは非破壊的であり、はキューの先頭を返します

このメソッドは、呼び出しの間にキュー内の要素に変更がない限り、常に同じ要素を返します。 キューが空の場合、peekはnullを返します:

String colorsHead = colors.peek();

5.2. 要素メソッド

elementメソッドはpeekに似ています—はキューの現在のヘッドを返します。

ただし、キューが空の場合、elementメソッドは例外をスローします。

colorsHead = colors.element();

5.3. Getメソッド

キューから特定の要素を取得する必要がある場合は、getメソッドを使用できます。 このメソッドは、目的の要素のインデックスを引数として取ります。 キューのインデックスはゼロベースです。

以前に要素で埋めたcolorsキューから要素を取得しましょう。

String color = colors.get(1);

これにより、「Blue」が返されます。

次に、キューに3つの要素を追加して、この結果をもう一度確認しましょう。

colors.add("Orange");
colors.add("Violet");
colors.add("Pink");
		
color = colors.get(1);

今回は、getメソッドは「Black」を返します。 これは、キューが5つの制限されたサイズで作成され、最初の3つの要素(「」、「」、「」)が作成されたためです。新しいものを追加して削除されました。

5.4. ポーリングメソッド

poll メソッドは、キューの先頭要素を削除し、その要素を返します。 キューに要素がない場合、 pollメソッドはnull:を返します

colorsHead = colors.poll();

5.5. 削除メソッド

removeメソッドはpollメソッドとほとんど同じように動作します—キューの先頭を返し、返された要素を削除します。 ただし、、キューが空の場合、removeは例外をスローします

colorsHead = colors.remove();

5.6. クリアメソッド

キューを空にする場合は、clearメソッドを使用できます。

colors.clear();

6. 確認方法

キューの要素を追加、削除、取得する方法を確認した後、サイズと容量の確認に関してクラスが提供するものを確認しましょう。 この例では、前のセクションで作成したキューを使用します。

一般に、キューのサイズを確認する方法は2つあります。1つはオブジェクトの最大サイズを取得する方法で、もう1つは現在の要素数を確認する方法です。

maxSize メソッドは、キューの最大サイズのinteger値を返します。

int maxSize = bits.maxSize();

bits キューがデフォルトのコンストラクターで作成されたため、これは32を返します。

size メソッドは、現在キューに格納されている要素の数を返します。

int size = colors.size();

キューオブジェクトの容量を確認するには、isEmptyメソッドとisAtFullCapacityメソッドを使用できます。

isEmpty メソッドは、キューが空かどうかを示すboolean値を返します。

boolean isEmpty = bits.isEmpty();

キューがいっぱいかどうかを確認するには、isAtFullCapacityメソッドを使用できます。 このメソッドは、キュー内の要素の最大サイズに達した場合にのみtrueを返します

boolean isFull = daysOfWeek.isAtFullCapacity();

このメソッドは、バージョン4.1以降で使用可能であることに注意してください。

キューがいっぱいかどうかを確認するために使用できるQueueインターフェイスのもう1つのメソッドは、isFullメソッドです。 CircularFifoQueue の場合、キューは常に新しい要素を受け入れることができるため、isFullメソッドは常にfalseを返します

boolean isFull = daysOfWeek.isFull();

7. 結論

この記事では、Apache Commons CircularFifoQueueの使用方法を見ました。 キューオブジェクトをインスタンス化する方法、オブジェクトを埋める方法、オブジェクトを空にする方法、オブジェクトから要素を取得および削除する方法、およびキューオブジェクトのサイズと容量を確認する方法を示すいくつかの例を見ました。

この記事で使用されている完全なサンプルコードは、GitHubプロジェクトにあります。 これはMavenプロジェクトなので、インポートしてそのまま実行できるはずです。