2次元配列をバブルソートする方法。

本記事のポイント

2次元配列はテーブルであり、テーブルはクラスで定義され、クラス定義はキーとなるプロパティとその他のプロパティで構成され、これでもってインスタンス(オブジェクト)を生成し、はじめてフォーマット定義情報を格納することができます。

固定長データ定義テーブルの生成

やりたいことは「勤怠データにある多数のフィールドの中から4フィールドだけを固定長CSVフォーマットとして生成」するために必要な「テーブルに格納されたフォーマット定義情報を出力順に2次元配列に格納」することです。まずテーブルの値を2次元配列に格納し、次に2次元配列を出力順にソートします。

actresult

CSVフォーマットに含めたい勤怠データのフィールドは

  1. 従業員コード
  2. 部門コード
  3. 勤務時間
  4. 工場コード

の4つであり、フォーマット定義情報(各フィールドのプロパティ)は以下のとおり。

  1. 上記4フィールドのコード(キープロパティ)
  2. 出力順
  3. 空白埋めorゼロ埋め
  4. 少数点位置
  5. 桁数
  6. 必須or任意

ここで使うアルゴリズムがバブルソートとループ、というよりバブルソートはループの入れ子構造です。前準備としてテーブルの値を2次元配列クラスとして定義するので、このお題って情報処理の基本盛りだくさんの良問じゃないかなww。

2次元配列

  • 万物は属性(プロパティ)からなるクラスによって実体化されたインスタンス(オブジェクト)であり、クラスのキーはアイデンティティである。
newclass
新規クラス追加

このインスタンスがOracleのサービスだった場合には管理者が必ず1人居て複数のスキーマ(ユーザー)を定義することができます。またOracle DB(スーパークラス)の中に複数のインスタンスを起動・停止することも可能ですが、インスタンスの数と同数のサービスを提供するため負荷がかかります。

要は2次元配列はテーブルであり、テーブルはクラスで定義され、クラス定義はキーとなるプロパティとその他のプロパティで構成され、これでもってインスタンス(オブジェクト)を生成し、はじめてフォーマット定義情報を格納することができます。

2次元配列(テーブル)の書き方はArray(列, 行)なので配列の定義はArray(5, 出力フィールドの数)となり、まずはArray(0, 0)~Array(0, objectCount-1)にキープロパティであるコード(勤務時間・従業員コード・部門コード・工場コード)が格納されます。

そしてArray(0, 0)からArray(5, 0), Array(0, 1)からArray(5, 1)・・・というようにキーごとのプロパティの値が格納されていきます。

array

ちなみにExcelのセルもA1, B1, C1・・・のように列行の順だが、VBAのCellsプロパティでセルを指定する場合はWorksheets(“sheet1”).Cells(行, 列)のように行と列を逆に指定することに未だに戸惑うのは僕だけだろうか・・・。

バブルソート

2次元配列に格納されたフォーマット定義情報は「出力順」にソートしておかないと配列アルゴリズム上都合が悪い。
sort
バブルソートは概念的には非常に判りやすいソート方法だが、これを絵を描かずして他人に正確に伝えるうまい説明があったら教えて欲しいくらいで、非常に高度な日本語力が要されると思いますw。

「自分より下にある数字と順番に比較していき、大小逆なら入れ替える、という処理を最後の数字まで繰り返す」、、、微妙。これにより一番小さい値を確定、二番目に小さい値を確定・・・n-1番目に小さい値を確定という具合に最後の1つが残るまで繰り返します。
sort

上述のとおりバブルソートは外ループと内ループの二重構造になります。

ループ処理

バブルソートのコードにあるDo ~ Loop while文は「最後の値まで読ませる」処理に使いやすく、条件文が処理の後にあるため、最低一発目のデータについては処理を行ないます。

これなら処理対象レコード件数が0件しかないケースにも対応できますが、Do While ~ Loopのように条件文が処理の前にある場合は一発目のデータが条件に合わなければ一度もループを通らないので結果が出力されません。

今回はループ回数が定義可能なのでFor ~ next文でも対応できます。
loop