連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第6回 配列ってこんなに便利だったの!?

羽山 博
2007/02/03
Page1 Page2 Page3

基本に戻って、意外な発見!

Back Issue
1
VB 6の皆さん、これはもうVB 2005使うしかないでしょ
2 コントロール配列がなくても大丈夫!
3 VB 2005の“My”の便利さに脱帽!
4 トラブルは水際で防げ〜入力時のチェックとエラー処理
5 データベースはじめの一歩

 もうすでに2月になってしまったが、2007年の最初の記事なので、今回は基本的なところに少し立ち戻ってみようと思う。あらためて基本を確認してみると、それまでずっと誤解していたままになっていたことや、知らないうちに追加されていた便利な機能があることに、意外に気付くものだ。ちょっとした発見に感動を覚えることすらある。

 そんなわけで、今回のテーマの「配列」となるわけだが、1964年にBASIC言語が誕生して以来、40年以上の長きにわたって使われてきた機能に、いまさら見るべきところがあるのか、と思われる方もおられるかもしれない。……などと、歴史を持ち出すのは大げさだが、それは抜きにしても「配列は配列でしょ、かっこの中にインデックス書けばいいだけじゃん」とか「繰り返しの中でインデックスを動かして、配列の要素を処理すればいいんでしょ」と軽くスルーされてしまうかもしれない。

 ところが、Visual Basic 2005(以下VB 2005)の配列はちょっと違う。いや、見た目はさほど違わないが、もっと便利なのだ。例えば、配列の要素を検索するのも、並べ替えるのも、逆順に並べるのも、配列をコピーするのもメソッド1つでできてしまう。確かに、いまや並べ替えのコードを自分で書く必要はほとんどないのだが、関数に配列を渡したりするのではなく、メソッド一発!というのがうれしい。

 では、簡単なサンプル・プログラムを使って並べ替えの例を見てみよう。

サンプル・プログラム7 − ランダムな並べ替えのためのコード

 最初のサンプル・プログラムは、数字をランダムに並べ替えるというもの。例えば、「12345」を「32541」のように並べ替える。

 一見、何の役にも立たなさそうだが、いろんな場面でよく使う。例えば、座席などの順序をランダムに決める場合、神経衰弱のようなパズル・ゲームの問題を作る場合、実験などで順序による影響を排除するために刺激の提示順序をランダムに決める場合、などなど。

 ただ一定の範囲の乱数を順に発生させるだけなら簡単だが、重要なのは重複する値がないということ。乱数を順に発生させるだけだと、以前に発生させた値と同じ値が生成されることもある。その値を除外するのは意外に面倒だ。例えば、単純に以前の値をすべて調べ、重複するものがないかどうかチェックする方法だと、乱数を発生させるたびごとにそれまでの全データをチェックしないといけないので、時間がかかりすぎてしまう。

 このようなランダムな数字の並びを作るにはいくつか方法があるが、繰り返しを最小限で済ませる最も簡単な方法は、それぞれの数字に乱数を与え、乱数をキーとして並べ替えるという方法だろう。つまり、図1のような感じになる。


図1 ランダムに数字を並べ替える
まず、それぞれの数字に乱数を与える。次に乱数をキーとして並べ替えを実行する。繰り返しをさらに少なくするほかの方法もありそうだが、この方法が一番分かりやすいだろう。

■フォームのデザイン

 では、さっそくプログラムのデザインから始めよう。実行結果はリスト・ボックスに表示するものとして、必要なコントロールを配置しよう(図2)。


図2 フォームのデザイン
実行結果はリスト・ボックスに表示するものとして、必要なコントロールを配置する。
  フォームの名前(=プロパティ・ウィンドウの(Name)プロパティ)は「frmRandom」とし、Textプロパティは「ランダムに並べる」とした。そのほかのプロパティは必要に応じて変更すればよい(最大化ボタンを使わないとか、ウィンドウの境界をダイアログボックスと同じように固定するなど)。
  結果を表示するためのリスト・ボックス。(Name)プロパティは「lstRandom」。
  並べ替えを実行するためのボタン。(Name)プロパティは「btnSort」。
  プログラムを終了させるためのボタン。(Name)プロパティは「btnEnd」。

■コードの記述〜配列の宣言から乱数の生成まで

 このプログラムの中心となるコードは、btnSortコントロールのClickイベント・ハンドラ。デザイナ・ウィンドウでbtnSortコントロールを選択し、[プロパティ]ウィンドウの[イベント]ボタンをクリックして、Clickイベント・ハンドラに名前を付けよう。ここでは「sortArray」という名前にする(図3)。


図3 btnSortコントロールのClickイベント・ハンドラを作成する
イベント・ハンドラの作成は基本中の基本だが、念のため。
  btnSortコントロールをクリックして選択する。
  [イベント]ボタンをクリックする。
  [Click]の欄に「sortArray」というイベント・ハンドラ名を入力する。

 イベント・ハンドラが作成されるとコード・ウィンドウが表示されるので、以下のコードを入力する。まだ続きはあるが、取りあえずは配列を2つ宣言し、乱数を入れるところまでを見ておこう。

Private Sub sortArray(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort.Click
  Dim fKey(9) As Single ' キーとなる配列(乱数を入れる)
  Dim iData(9) As Integer ' データ(最初は0〜9を入れる)
  Dim i As Integer
  Randomize() ' 乱数の初期化
  For i = 0 To 9 ' 配列のすべてのデータについて
    fKey(i) = Rnd() ' 乱数を入れる
    iData(i) = i  ' iを入れる
  Next
 
  : 続きは後で……
 
End Sub
配列に乱数を入れるコード
  キーとなる配列を宣言する。データ型は単精度の浮動小数点数。要素は0から9までの10個とする。
  データの配列。データ型は整数型。要素は0から9までの10個。
  乱数を初期化する。
  乱数を発生させ、キーとなる配列の要素に入れる。

 最初に、配列の変更点について触れておこう。

 VB 2005では、Option Baseステートメントが使えなくなり、配列の下限を変更することはできなくなった。つまり、配列のインデックスは常に0から始まるものとされる。

 配列を宣言するときにはカッコ内にインデックスの最大値を指定する。これは基本中の基本のさらにまた基本だが、要素数を指定するのではないことに注意(白状すると、私自身、ほかの言語でプログラムを書いた後、VB 2005に戻ってくるとついうっかりと要素数を書いてしまうこともある)。従って、

Dim fKey(9) As Single

と書けば、0から9までの10個の要素が使えることになる。

 乱数については特に悩むことはないだろう。Rnd関数を使えば、0以上1未満の乱数が生成できる。ただし、乱数の系列を初期化するためには、最初に1度Randomizeステートメントを実行しておく必要がある。乱数を生成するには.NET Frameworkクラス・ライブラリのSystem名前空間のRandomクラスを使うという方法もあるが、単純に乱数を発生させるだけであれば、VB 2005のRnd関数で十分だろう*

* VB 2005のRnd関数で生成される乱数も.NET Frameworkクラス・ライブラリのRandomクラスを使って生成される乱数も、アルゴリズムを知っている人には結果が予測できる可能性があるので、暗号化のための乱数には適していない。暗号化のためには、System.Security.Cryptography名前空間のRandomNumberGeneratorクラスなどを利用する必要がある(「.NET TIPS:乱数を生成するには?」でも解説されている)。

 以上で、数字とそれに対する乱数の準備はできた。最初に見た図1でいえば、配列の内容は左側の表のような状態になっている。

■コードの記述〜配列の並べ替えからリスト・ボックスへの表示まで

 では、コードの続きを見てみよう。配列の要素を並べ替えるには……と考えると、その面倒さに暗い気持ちになる人も多いのではないかと思うが、実は、.NET Frameworkクラス・ライブラリのArrayクラス(System名前空間)を使って、

Array.Sort(配列名)

と書くだけで、その配列の要素が並べ替えられる。しかも、

Array.Sort(キー配列, データ配列)

と書けば、キー配列に従って、データ配列も並べ替えてくれる!

 先ほどのコードの続きを書いてみると、以下のようになる。念のため、プログラムを終了させるbtnEndコントロールのClickイベント・ハンドラも示しておいた。

Private Sub sortArray(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort.Click
 
  : ……先ほどの続き
 
  Array.Sort(fKey, iData) ' 配列を並べ替える
  lstRandom.Items.Clear() ' リスト・ボックスをクリア
  For i = 0 To 9 ' リスト・ボックスに結果を表示
    lstRandom.Items.Add(i & ":" & iData(i) & ":" & fKey(i))
  Next
End Sub

Private Sub exitProc(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
  Application.Exit() ' アプリケーションの終了
End Sub
キー配列を使って配列を並べ替えるコード
  ArrayクラスのSortメソッドにキー配列とデータ配列を指定し、昇順に並べ替えを実行する。
  リスト・ボックスをクリアする。
  リスト・ボックスに番号、データ、キーを追加する。

 図4に実行例を示しておこう。


図4 プログラムの実行例
コロンで区切られた2番目のフィールドに注目。0から9までの数字が重複することなくランダムに並んでいる。

 プログラムが出来て「めでたしめでたし」とおしまいにできればいいのだが、そういうわけにもいかない。このプログラムを見ていると、もっといろんなことをやりたくなってくるだろう。ほかの方法がないか探してみたくもなる。

 例えば、降順に並べ替えるにはどうすればいいの? とか、DataGridViewコントロールを使えば並べ替えなんて一発でできるんじゃないか、とか……。そこで、降順に並べ替えるプログラムを、いくつかの方法が比較できるようにして作ってみる。


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第6回 配列ってこんなに便利だったの!?
  1.サンプル・プログラム7 − ランダムな並べ替えのためのコード
    2.サンプル・プログラム8 − 降順に並べ替えるいくつかの方法
    3.並べ替えを行う3つの方法を実装
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH