【ループ処理のテンプレート】ループ処理を作るときは、”キーブレイク”で!

loop コーディングスキルを高める

ループ処理の実装を単純だと思うのは大間違いです。
分岐よりも複雑で、多重ループになるとソースを追うのも大変になるほど難しくなります。

  • 数百万、数千万件の集計
  • 複数のリストのマージ、大小比較
  • 子リスト、孫リストの値をもとにした分岐

これらの実装は、いつも苦労します。
ループに入る際の初期値をどうするのか。ループの最終行は正しく処理されているのか。ループの中で何の値をもとにして集計をしていけば良いのか。

そんなあなたに朗報です。

ループ処理には、”キーブレイク”というテンプレート(一つの型)があります。
ほとんどのループ処理は、この型で作れるでしょう。上記のような悩みも解決できる考え方です。
どのように作るのか、見ていきましょう。

キーブレイク処理 処理フロー

program

たとえば、スーパーの1日の売上情報を、日付・商品ごとに集計する場合を考えてみましょう。

1日の売上情報は、以下のようなリストです。

商品コード,売上日時,売上数量,単価,小計
—————————————————————
00001,2021/01/01 10:00:00,1,100,100
00001,2021/01/01 15:00:00,2,130,260
00001,2021/01/02 14:00:00,5,1800,9000
00002,2021/01/01 09:30:00,10,130,1300
00002,2021/01/01 16:00:00,1,100,100
・・・・

集計結果は、以下のようなリストです。

商品コード,売上日,小計
———————————————————–
00001,2021/01/01,360
00001,2021/01/02,9000
00002,2021/01/01,1400
・・・・

以下が、キーブレイク処理のフローチャートです。
フロー図を読み解くのが難しくなった場合は、上記の例を参考にしつつ読み進めてください。

keybreak

上記の例の場合、それぞれの用語があらわすものはというと

集計対象リスト:スーパーの1日の売上情報
最終結果リスト:日付・商品ごとの小計を計算した結果
work.キー:商品コードと売上日の2つ
集計結果:日ごとの売上情報(数値)

処理の内容を簡単に説明すると、

・最初に変数の値を初期化
・1日の売上情報を全件ループ
・商品コードと売上日が同じであれば、小計を加算
・加算した結果を日付・商品ごとの小計としてリストに追加

このようになっています。
キー項目の値によって、既存の値を加工するのか集計結果として出力するのかが分かれるため、キーブレイク処理と呼ばれています。

細かい部分は、上図をしっかりと読み解いてみてください。
ちなみにですが、基本情報技術者試験にもフロー図を読み解く問題は出るので、厳密に読み解けるように何度も練習することを強くお勧めします。

スポンサーリンク

キーブレイク処理 注意するポイントとは

caution

複雑なループ処理のテンプレートとして活躍するキーブレイク処理。
実装時の注意点は、以下の2つです。

集計対象リストのソート順

何気なく1日の売上情報を、商品コード・売上日時順にソートされたリストとして記述しましたが、ここが一つ目のポイントです。

リストの順番は、キーブレイクできる順番にそろえる必要があります。

もしも、1日の売上情報が売上日時・商品コード順にソートされていた場合、この処理は失敗してしまうということです。同じ商品・同じ日付の売上情報が最終結果リストにいくつも登場することになるでしょう。

集計対象リストのデータの特徴に合わせて、ソート順を指定したうえでキーブレイク処理に入るようにしましょう。

最終行の処理を忘れない

ループを抜けて一安心、これで実装完了・・・とはなりません!

最終行の処理を忘れないでください。

キーブレイク処理では、集計対象リストの最後のキー項目に関する情報が、最終結果リストに反映されないという難点があります。
ここの書き忘れによるバグは、頻出度トップレベルです。よくある間違いこそ、事前に回避しましょう。

また、最終行の処理をする前に、キー項目が存在しているかどうかの確認を忘れないようにすることも大切です。
上記のフローチャートだと、リストに1行もなかった場合や、集計対象リストの最終行のキーがNULLだった場合(場合によってはありえます)に、この分岐を書いていないと空行が最終結果リストに追加されてしまうからです。

ループを抜けたときこそ、気も抜けがちです。
最後まで気を抜かず、丁寧に仕上げましょう。

複雑なループ処理とは、どのようなものか

spaghetti

以上が、ループ処理の基本形です。

しかし、世の中にはもっと複雑なループ処理が山ほどあります。

  • 1回の処理時間に制限がある場合は、一度にすべてを処理するのではなく、小分けにする、かつ、どこまで処理したかの状態を保持する
  • キーブレイク処理を2階層、3階層と多重的に実装する
  • AリストとBリストを1行ずつ突き合わせてマージし、Cリストを作成する

このような複雑な処理は、キーブレイク処理を守りつつ、必要なところを変えて応用させていくことになります。

だからこそ、まずは基本の型を確実に身につけましょう。

タイトルとURLをコピーしました