‫このビデオでは､ キューを取り上げ､ アプリケーションでキューを使用する方法について説明します｡
‫キューは重要なもので､ 例えば私たちのオペレーティングシステムでは､ タスクやスケジューリング､ その他多くの処理を処理するために多く使われています｡
‫キューは､ この例で見るように､ データの順序が重要な場合に使用されるべきです｡
‫では､ まずキューを定義してみましょう｡
‫キューを定義するために､ キューを使用することができます｡
‫キーワードキューもジェネリックコレクションの一部であり､ キューがどのようなタイプを取り込むかを定義する必要があることを意味します｡
‫この場合､ 整数の束を保持することになりますが､ 他の型も保持することができます｡
‫文字列も入るし､ 物も丸ごと入る｡
‫そのため､ このアイテムに何を持たせるかは､ 完全に自由です｡
‫つまり､ キュー→レス→サイン→グレーターサイン→キューの名前がイコールになるわけです｡
‫そして､ ここで行っているように､ 整数を保持する空のキューを作成するだけで､ すぐに初期化することができます｡
‫それでは､ このキューにアイテムを追加していきましょう｡
‫キューに項目を追加するには､ end queue メソッドを使用することができます｡
‫queue メソッドは､ キューの末尾にオブジェクトを追加します｡
‫ですから､ 例えば1つのような項目を追加すると､ この項目はまあ最初に含まれるからですが､
‫最後の項目にもなるわけです｡
‫そのため､ 別のものを追加するとすぐに､ 新しいアイテムがキューの最後のアイテムになります｡
‫注文はそういうものなんですね｡
‫スタックと似ていますが､ キューは何かを取り除くときに､ アイテムをポップするときに､
‫キューの先頭から取ってくるという違いがあります｡
‫つまり､ 先に作られたアイテムが取り上げられる､ あるいはいわばキューから弾き出されることになるわけです｡
‫そこで､ キューの項目を見るために､ peakメソッドを使用します｡ このpeakメソッドは､ キューの最初の項目､
‫いわばキューの先頭を表示します｡
‫つまり､ 例えばカウンターに並んでいる人が何かを注文するような場合､ ピーク法ではその列の中で最初に注文しようとしている人が表示されるのです｡
‫では､ 実際に素早く実行して､ これがどのように見えるかを見てみましょう｡
‫そして､ キューの先頭にあるバリューが1であることがわかります｡
‫では､ さらにいくつかの値を追加して､ それがアプリケーションにどのような影響を与えるか見てみましょう｡
‫ここでは､ Q1を終了し､ Q2､ Q3､ そしてこれらの数字1､ 2､ 3を使用するように､ 異なるQ項目を追加するつもりです｡
‫それ以外の数字もあり得る｡
‫別に1､ 2､ 3である必要はないんです｡
‫つまり､ ピーキングを使えば､ キューの先頭にあるアイテムが手に入るわけです｡
‫毎回､ Qに何を加えても､ 1がQの最初の項目になるので､ peakメソッドを使ったときに表示されるのが1であることがわかりますね｡
‫さて､ キューからアイテムを取り除くには､ キュー・メソッドを使います｡
‫だから､ ここに｡
‫Q dot rd q ですから､ この D q は Q の最初の整数を取り除き､ それをそのまま保存します｡
‫たとえば､ これを 1 つの Q アイテムと呼び､ この dict アイテムの結果を保存します｡
‫つまり､ 基本的にはリストの最初の項目なので､ そこに1が格納されます｡
‫そして､ 北京は2つ表示します｡ 今は1つがなくなってしまったからです｡
‫最初のアイテムはなくなりました｡
‫ということは､ Qの値は2になるわけで､ まあ､ 最初の項目をデコードしただけですから｡
‫つまり､ スタック内のポップに似ていますが､ Qの最後やスタックの最後ではなく､
‫Qの最初にあるアイテムを取り去るということです｡
‫もちろん､ 最初からキューに入れることも可能です｡
‫キューの中に要素がない場合､ しかし､ 無効な操作の例外に遭遇することになります｡
‫キューは空なので､ これを実行する前にキューが空かどうかを確認する必要があります｡
‫ここで､ 何かをエンコードしたことがわかったので､ queueメソッドを実行することができます｡
‫しかし､ そうでなければ､ キューにあるアイテムの数を把握するために､ キューのcountプロパティを使用することになります｡
‫つまり､ これは､ キューに含まれる要素の数を取得し､ その1が0より大きいかどうかをチェックすることができるプロパティで､
‫例えば､ キューの中に何かあるかどうかをチェックすることができます｡
‫だから､ この特別な例では､ 私の｡
‫whileループでダブルチェックするためにカウントしているのでしょうか？
‫そして､ ひとつひとつのアイテムについて､ キューに入れ､ まだキューに残っているアイテムの量と､ 削除されたアイテムも書き出します｡
‫つまり､ この行はキュー・メソッドを呼び出してアイテムを削除すると同時に､
‫アイテムをここに表示しています｡
‫文字列を使うんですよね？
‫そして､ この位置が0であれば､ キューの呼び出しの結果であれば､ 何でも表示されることになります｡
‫そして､ ここでわかるように､ queueメソッドは整数を返します｡
‫そこで､ ここに数字を表示することにします｡
‫なるほど｡
‫そこで､ アイテムを取り出す方法を示すために､ ここで使用したこのキューを取り除くことにしましょう｡
‫そして､ もう一度実行してみましょう｡
‫そして､ 前面に価値を見出すことができる､ この1枚｡
‫そして､ 基本的にここからYループを開始します｡
‫そこが面白いところです｡
‫そこで､ 1つの単語がキューから削除されます｡
‫これで､ キューから削除されたアイテムは2つだけとなりました｡
‫今､ 私たちは1つのアイテムしか残っておらず､ 3つはキューから削除されていません｡
‫これで残りは0点のみ｡
‫つまり､ 基本的にその時点ではキューは空っぽなのです｡
‫わかりました｡
‫では､ 多かれ少なかれ実例を挙げてみましょう｡
‫もちろん､ この単純な例ではデータベースは扱いませんが､ eコマースプラットフォームがあり､
‫私たちが販売者になって､ たくさんの注文を受けたとします｡
‫これらの注文は､ サーバーの時間がかかるように処理する必要があります｡
‫だから､ お客さまの待ち時間は最小限に抑えなければならない｡
‫このように､ 注文が来る順番を気にするため､ キューを使うのは非常に実用的だからです｡
‫注文の順番は､ ちょっと舌足らずですが､ データを受け取った順番で､ データというのは注文そのものを意味します｡
‫では､ これから作る非常にシンプルなクラスを見てみましょう｡ このクラスは､ 同じファイルの中に置きます｡
‫このクラスorderにはorder IDプロパティとorder quantityプロパティがあり､ コンストラクタではorderオブジェクトを作成する際にこれら2つの値を設定するだけです｡
‫そしてprintメッセージまたはprocess orderメソッドがあり､ 現在見ている項目のorder ID､ つまり現在見ているorderを出力します｡
‫そこで､ 今度は実際にプログラムクラスの中にメソッドを作ってみたいと思います｡
‫そこで､ この括弧の中に入れて､ さまざまなブランチからの注文を処理するメソッドを用意しました｡
‫そこで､ 注文を受けることができる支店が2つあるとします｡
‫例えば､ アマゾンで販売すると同時に､ ベストバイでも販売するとします｡
‫そして､ これからその注文を受けることになります｡
‫さて､ どのブランチが､ その､ 異なるブランチの順番を確認するのか､ あまり複雑にしないようにします｡
‫これはもちろん､ それを発展させようと思えば､ 自分へのちょっとした挑戦として見ることもできます｡
‫しかし､ 私たちは､ よし､ 第一支店からの命令を正しい順番で出してくれ､ 第二支店からの命令も正しい順番で出してくれ､
‫と言うだけなのです｡
‫なるほど｡
‫これが注文の多い第1支店になり､ 次に注文の多い第2支店になるわけです｡
‫だから､ データが取れているんです｡
‫例えば､ データベースからこのデータを取得し､ よし､ 注文は何だったか､ とチェックしているとしましょう｡
‫そして､ 日付ごとにチェックすることになるのでしょう｡
‫だから､ 各注文には日付もつく｡
‫ここにはオーダーIDがありますが､ 通常はいつオーダーされたのかなども格納するようにします｡
‫しかし､ この例ではシンプルにするつもりです｡
‫つまり､ この2つの例では､ 注文の配列が出来上がっているのです｡
‫そして､ このメソッドを呼び出すと､ ブランチ1とブランチ2から注文を受け､ 基本的に再ターンして配列の注文をするだけです｡
‫そこで､ ここでオーダーの数々を紹介します｡
‫つまり､ この文は､ 注文を返すということです｡
‫さて､ この例では､ 注文IDは実際には2つの異なる注文に対して一意となるようにします｡
‫いわば､ すでに正しい順序で並んでいることになるわけです｡
‫これがオーダー1､ これがオーダー2ですね｡
‫そして､ 第2ブランチからオーダー3､ オーダー4､ オーダー5があります｡
‫そして夕方､ 第1支店にまた注文が入り､ 誰かが私たちの商品を10個買ってくれたのです｡
‫さて､ mainメソッドでキューを作成し､ 実際にここにあるものをすべて取り除いてみましょう｡
‫メインメソッドでは､ 注文のキューを作成することができます｡
‫では､ ここで行列の順番を｡
‫今の整数のような単純な型ではなく､ 実際にはたくさんのオーダーを保持することになるのがお分かりいただけると思います｡
‫それが､ キューのクールなところです｡
‫ですから､ 単純な型だけでなく､ この1つの注文キューを呼んで､ ここですぐに初期化するつもりです｡
‫そして､ この時点で､ このforループ､ for eachループを使って､ Branch 1から得たすべての注文をキューに入れることができます｡
‫だから､ 電話する順番をひとつひとつ確認しているんです｡
‫ああ､ このfor eachループとこの反復で､ 私たちはブランチ1から命令を受け取る｡
‫さて､ ここでの型は順序配列になります｡
‫そこで､ このメソッドを呼び出すと､ ここにあるような注文の配列が返されます｡
‫つまり､ このfor eachループは､ order配列の中にある注文をひとつひとつ見ていくことになります｡
‫だから､ すべてはまずこの順番になり､ 次にこの順番になり､ そしてあの順番になる｡
‫そして､ その一つひとつに､ それらの注文の行列ができるのです｡
‫つまり､ このfor eachループはそういうことです｡
‫そして､ もう一方のブランチについても､ 同様にfor eachループを作成します｡
‫だから
‫第2ブランチから受け取ったループやインオーダーについても同様です｡
‫これが第二支店ですね｡
‫こちらは第1支店｡
‫そして､ 同じことが言えます｡
‫つまり､ 同じコンセプトが適用されるわけです｡
‫そこで､ 注文を処理するために､ キューを一つずつ調べていき､ キューから要素を取り除き､ キューが空になり､
‫最終的にすべての注文が処理されるまで､ 処理を行います｡
‫そのため､ ここにprocess orderメソッドを用意して､ 注文を処理するようにしています｡
‫さて､ ここでメインメソッドの代わりに､ すべてのアイテムを含むオーダーキューを取得したら､
‫それを調べて､ オーダーキューが空でないかどうかをチェックすることができるようになりました｡
‫つまり､ オーダーキューのカウントが0より大きい限り､ このwhileループを実行し､
‫キューの先頭にあるオーダーを削除するつもりなのです｡
‫いわば最初に来た順番で､ current orderという変数に格納するわけです｡
‫この注文オブジェクトは Current Order と呼ばれるもので､ 基本的に注文キューの最初の項目にあるキューの結果になります｡
‫だから､ 基本的にはまずこの項目を取り上げて､ 次にこの項目､ そしてあの項目､ この項目､ そしてあれとあれを取り上げる｡
‫そして､ その一つひとつを段階的に処理していくのです｡
‫そのため､ 処理も私たちのケースも､ 非常にシンプルなものになります｡
‫コンソールに出力されるだけです｡
‫しかし､ もちろん､ ここのバックグラウンドでもっと複雑なものを実行することも可能です｡
‫これにより､ 例えば､ 時間のある従業員にメールを送信するなどのイベントが発生したり､
‫社内で採用している処理システムが利用されたりする可能性があります｡
‫わかりました｡
‫そうそう､ 基本的にはそれだけです｡
‫それでは､ このアプリケーションを実行して､ 結果を確認してみましょう｡
‫そして､ オーダー1が処理されたことが確認できます｡
‫オーダー2が処理され､ オーダー6が処理され､ そして3､ 4､ 5が処理された｡
‫そこで､ 注文の処理をしています｡
‫もちろん､ 私たちがキューに入れる順番は､ 私たちがキューを終了する順番です｡
‫ここでは､ 1/1ブランチと2ブランチからキューイングされているのがわかります｡
‫次のようなシナリオを想像してみてください｡ 内部で作成された注文が､
‫まず処理担当者に受け入れられ､ 完全にプッシュされなければならない｡
‫そして､ 一日の終わりなどに行うのです｡
‫だから､ まず支店の人が自分のものを仕上げて､ 「じゃあ､ その注文を受け付けます」と言うんです｡
‫そして､ その日のうちに､ 仮に相手が違う時間帯にいるとしますから｡
‫例えば､ 支店2が､ ああ､ 同意見だ､ と言っている｡
‫まあ､ その時点で承認されたものとして注文を出し､ 処理に入るわけですが｡
‫この例は､ 例えばそういう風に考えられるわけですね｡
‫そうでなければ､ もちろん､ IDをもとに､ あるいは作成された時間をもとに､ すぐに注文することになります｡
‫わかりました｡
‫これで､ これらの注文がどのように行われ､ どのようにキューが機能するかについて､ 一定の理解が得られたのではないでしょうか｡
‫そこがもっと重要なところです｡
‫これで､ 独自のキューを作成し､ アプリケーションで使用することができるようになったわけです｡
‫わかりました｡
‫というわけで､ このビデオを楽しんでいただけたでしょうか？
‫次回作でお会いしましょう｡