VB.NETのキュー(Queue)を完全解説!初心者でもわかるFIFO処理と使い方
生徒
「VB.NETで、レジの行列のように『先に来た人から順番に処理する』仕組みは作れますか?」
先生
「もちろんですよ。VB.NETには『Queue(キュー)』という、順番待ちを管理するのにぴったりの道具があります。」
生徒
「キュー……。聞き慣れない言葉ですが、初心者でも簡単に使えるのでしょうか?」
先生
「はい、基本的なルールさえ覚えればとてもシンプルです。今回はその仕組みと使い方を一緒に見ていきましょう!」
1. Queue(キュー)とは?順番待ちの仕組み
VB.NETのQueue(キュー)とは、複数のデータを一時的に溜めておくための「入れ物」の一種です。プログラミングの世界では、このような入れ物のことを「コレクション」と呼びます。
キューの最大の特徴は、「先に入れたデータから順番に取り出す」というルールにあります。これを専門用語でFIFO(フィフォ)と呼びます。これは「First In, First Out(最初に入ったものが最初に出る)」の頭文字を取った言葉です。
パソコンを触ったことがない方でも、スーパーのレジ待ちや、行列ができるラーメン店をイメージすればすぐに理解できるはずです。最初に行列に並んだ人が、最初にサービスを受けられますよね。この「公平な順番待ち」をプログラムで実現するのがキューの役割です。
2. キューの基本:データの追加(Enqueue)
まずは、キューにデータを入れる方法を学びましょう。キューに新しいデータを追加することをEnqueue(エンキュー)と呼びます。行列に新しい人が並ぶイメージですね。
VB.NETでキューを使うには、Queue(Of 型名)という書き方をします。例えば、文字列(名前など)を扱うキューを作りたい場合は、以下のように記述します。プログラミングにおける「型」とは、データの種類のことで、文字列ならString、整数ならIntegerを使います。
' 文字列型のキューを新しく作る
Dim waitList As New Queue(Of String)()
' エンキュー(データを末尾に追加)
waitList.Enqueue("田中さん")
waitList.Enqueue("鈴木さん")
waitList.Enqueue("佐藤さん")
Console.WriteLine("3人が列に並びました。")
このコードを実行すると、キューの中には「田中さん、鈴木さん、佐藤さん」の順番でデータが保存されます。配列とは違い、自動的に「後ろに並ぶ」という動きをしてくれるのが便利なポイントです。
3. キューから取り出す:データの取得(Dequeue)
行列の先頭の人を処理して、列から外す操作をDequeue(デキュー)と呼びます。デキューを行うと、キューの中で一番長く待っていた(一番最初に入った)データが取り出され、そのデータはキューの中から消えます。
「取り出す」と「消える」がセットになっているのが、後で説明する「確認だけする操作」との大きな違いです。レジで会計が終わったお客さんがお店を出ていく様子を想像してください。
' デキュー(先頭のデータを取り出して消す)
Dim firstPerson As String = waitList.Dequeue()
Console.WriteLine("案内された人: " & firstPerson)
Console.WriteLine("残りの人数: " & waitList.Count)
案内された人: 田中さん
残りの人数: 2
一番最初に並んだ田中さんが取り出され、残りの人数が2人に減っていることがわかりますね。これがFIFO処理の基本です。
4. 先頭のデータを確認する:覗き見(Peek)
「次の順番の人は誰かな?」と確認したいけれど、まだ列からは外したくない……。そんな時に使うのがPeek(ピーク)という命令です。Peekは、英語で「覗き見する」という意味があります。
これを使えば、キューの中身を減らすことなく、先頭にあるデータを取得できます。実際のプログラムでは、次に処理するデータがあるかどうかを確認してから、実際の処理(デキュー)に進むといった使い方をよくします。
' ピーク(先頭を覗き見するだけで消さない)
Dim nextPerson As String = waitList.Peek()
Console.WriteLine("次にお呼びする予定の人: " & nextPerson)
Console.WriteLine("現在の待ち人数: " & waitList.Count)
次にお呼びする予定の人: 鈴木さん
現在の待ち人数: 2
デキューとは違い、人数が減っていないことが重要です。慎重にプログラムを動かしたい時にとても役立つ機能です。
5. キューの中身を空にする・数える
列に誰も並んでいないか確認したり、一気に解散させたりする方法も覚えておきましょう。Countプロパティを使えば現在のデータの個数がわかります。また、Clearメソッドを呼べば、一瞬でキューの中身を空っぽにできます。
プログラムの中で、エラー(パソコンの不具合)を防ぐためには、「キューが空の時にデキューしようとしない」ことが大切です。行列に誰もいないのに「次の方どうぞ!」と呼んでしまうと、プログラムは混乱して止まってしまいます。これを防ぐために、必ずCountを確認する癖をつけましょう。
' 列が空ではないか確認してからデキューする
If waitList.Count > 0 Then
waitList.Dequeue()
Console.WriteLine("1人案内しました。")
End If
' すべてのデータを消去する
waitList.Clear()
Console.WriteLine("本日の受付は終了しました。")
6. 実務での使いどころ:どんな時に役立つ?
Queueは、実際のシステム開発の現場でも非常に多く使われています。具体的な例をいくつか挙げてみましょう。
- 印刷ジョブの管理: パソコンからプリンターに送られた複数の文書を、届いた順に印刷する仕組み。
- メール送信システム: 大量のメールを送信する際、サーバーに負荷をかけないよう一度キューに溜めて、1通ずつ順番に送る仕組み。
- ゲームのイベント処理: プレイヤーがボタンを連打した際、その操作を順番通りに実行する仕組み。
このように、「発生した出来事を、順番を崩さずにひとつずつ処理したい」という場面では、キューが最強のツールになります。配列やリストでも同じことはできますが、キューを使うことで「これは順番待ちの処理なんだな」と、他の人が見てもわかりやすい、スッキリとしたプログラムになります。
7. QueueとListの違いを知ろう
以前に学んだ「List(リスト)」も複数のデータを扱えますが、Queue(キュー)との大きな違いは何でしょうか?
リストは「好きな場所(中間や先頭など)にデータを割り込ませたり、特定の場所から取り出したり」が得意です。自由度が高いのが特徴です。一方、キューは「先頭から出す、末尾に入れる」という操作しかできない代わりに、順番の管理に特化しており、操作ミスが起きにくいというメリットがあります。
用途に合わせて道具を使い分けるのが、プログラミング上達のコツです。「順番が命!」という処理には、ぜひこのQueueを使ってみてください。これで、公平で正確なプログラムが作れるようになりますよ!