こんにちは。「Javaを復習する初心者」です。
Collections FrameworkにはQueueインターフェースというインターフェースがあります。今回はその実装クラスであるLinkedListクラスを使ってみました。
LinkedListでFIFO (先入れ先出し)をプログラミングすることができます。使うメソッドは以下です。
- offer(E e)
- remove()
各メソッドは以下の使い方です。offer(E e)で指定された要素をこのキューに挿入します。remove()でキューの先頭を取得および削除します。
フロー
今回はQueue<Character>クラスを定義して、offer(E e)で要素を追加し、サイズが5ならremove()でキューの先頭を削除するというプログラムを書きました。
以下にフローを書きます。
- 以下の変数を用意し、インスタンスをnewで生成して格納する。
型 変数名 List<Character> list Queue<Character> history - 繰り返しカウンタiが1から10まで以下を繰り返す。
- char型変数cにアルファベット小文字をランダムに格納する。
- listにcを追加する。
- historyのサイズが5の場合のみ、historyから先頭の要素を削除する。
- historyにcを追加する。
- 以下のフォーマットでコンソールに出力する。
フォーマット文字列 埋め字 “%2d: %s” i, history.toString()
- 改行する。
- “–“を出力する。
- list.toString()を出力する。
プログラム
以下はソースと実行結果です。
ソース
package collectionsFrameworkTest;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
public class HelloQueue {
public static void main(String[] args) {
List<Character> list = new ArrayList<>();
Queue<Character> history = new LinkedList<>();
Random random = new Random();
for (int i = 1; i <= 10; i++) {
char c = (char)('a' + random.nextInt(26));
list.add(c);
if (history.size() == 5) {
history.remove();
}
history.offer(c);
System.out.printf("%2d: %s", i, history.toString());
System.out.println();
}
System.out.println("--");
System.out.println(list.toString());
}
}
結果
1: [n]
2: [n, z]
3: [n, z, f]
4: [n, z, f, g]
5: [n, z, f, g, n]
6: [z, f, g, n, z]
7: [f, g, n, z, u]
8: [g, n, z, u, j]
9: [n, z, u, j, t]
10: [z, u, j, t, o]
--
[n, z, f, g, n, z, u, j, t, o]
コレクションのtoString()メソッドは中身を鍵括弧で囲ってカンマ区切りの文字列を返却してくれます。上記プログラムではiが1から5まで要素が増えていく様子が確認できます。
iが5のとき、キューの中身は[n, z, f, g, n]です。左側が先頭で最初に格納された文字です。iが6のときremove()メソッドが実行されて、「n」が削除されます。offer()メソッドで「z」が追加されます。これで先入れ先出しが実現できてます。