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

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

羽山 博
2007/02/03
Page1 Page2 Page3

サンプル・プログラム8 − 降順に並べ替えるいくつかの方法

 .NET Frameworkクラス・ライブラリのリファレンスを見てみると、ArrayクラスのSortメソッドでは並べ替えの順序が指定できるらしいということは分かる。が「IComparerインターフェイスを使う」とあり、これがなかなか手ごわそうだ(実際、手ごわい)。いずれ、その方法に取り組む必要は出てくるのだろうが、できれば、これまでの知識の延長で済ませたいと思うのが人の子。自分で並べ替えのコードを書くのもできるだけ避けたい。

 そこでもう少しリファレンスを見てみる。すると、降順に並べ替えるためのメソッドはないが、順序を逆転させるためのReverseというメソッドがあることに気付く。ここで、頭の中の電球がパッと光るはず。

Array.Sortで昇順に並べ替えてから、Reverseメソッドで逆順にすれば、降順になる

というわけだ。

 あまりに簡単なので、これは悪魔のささやきなのでは? という感もあるが、確実にできることは確かだろう。では、これで……と思うのだが、今度は天使が割り込んでくる。

IComparerインターフェイスを使った方法で正面からいくべき

と。確かに、数値だけの場合はReverseメソッドでも問題はないが、文字列を扱うようになってくると、並べ替えの順序も重要になってくる。IComparerインターフェイスを使えば、例えば、ロケールの違いや大文字と小文字を区別した並べ替えもできる。先のことを考えると、いま、少し苦労しておくのもいい。

 そういうせめぎ合いの中、頭の中に第三の登場人物が現れる。文化人類学的にいえば「道化」に当たる存在かもしれない。

DataGridViewコントロールを使えばいいじゃん

という別の発想だ。何もかもコードで書かなくても、せっかくいろんなコントロールが用意されているのだから、それを作業用に使えばいい。ユーザー・インターフェイスを作るためだけでなく、データ処理のための作業場所として使えばいいのではないか、というわけだ。

 どの方法を採用するかは、学習にかかるコスト、コーディングの手間、保守性、拡張性、プログラムの処理速度などを総合して決定する必要がある。が、ともかく、この3つの方法でコードを書いてみて、それぞれ比較してみよう。

 結果として得たいものが、サンプル・プログラム7のようなランダムな数列であれば、昇順に並べ替えようが、降順に並べ替えようが、どちらでも構わないので、並べ替えの結果そのものにはあまり意味はないのだが、同じようなプログラムで試してみることにする。

■フォームのデザイン

 フォームのデザインは、ここではあまり本質的な話ではないので、図示するだけにとどめておく(図5)。3つの方法で並べ替えを実行したときにかかった時間を[結果:]の下に表示する。


図5 降順に並べ替える方法を比較するための画面
  DataGridViewコントロール。(Name)プロパティは「dgvWork」。列を2つ追加する。
  それぞれの方法を選択するためのラジオボタン・コントロール。(Name)プロパティは上から順に「rbSort」「rbComparer」「rbDataGrid」。
  処理にかかった時間を表示するためのラベル・コントロール。Textプロパティの内容を削除したので、デザイナ・ウィンドウ上では見えなくなっている。(Name)プロパティは「lblTicks」。
  並べ替えを実行するためのボタン・コントロール。(Name)プロパティは「btnSort」。

■コードの記述 〜 配列の準備から並べ替えの方法を選択するまで

 公平を期するために、3つの方法で同じデータを使うようにする。そのため、キーとなる乱数の配列とデータ配列のマスターを用意しておく。プログラムに少し負荷をかけるために、要素の数は10000としておこう。ここではフォームをロードしたときに、このマスターとなる配列を作成する。

Public Class frmRandom
  Dim fKey(9999) As Single ' キー配列
  Dim iData(9999) As Integer ' データ配列
  Dim fKeyMaster(9999) As Single ' キー配列(マスター)
  Dim iDataMaster(9999) As Integer ' データ配列(マスター)
  Dim t1 As DateTime ' 処理の開始時刻
  Dim t2 As DateTime ' 処理の終了時刻

  Private Sub initArray(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim i As Integer
    Randomize()
    For i = 0 To 9999 ' マスターを作る
      fKeyMaster(i) = Rnd()
      iDataMaster(i) = i
    Next
  End Sub
フォームのLoadイベント・ハンドラ
サンプル・プログラム7とほぼ同じ。違う点は、配列のマスター・データを作っておくこと。それぞれの方法で並べ替えを実行するときには、マスター・データから検証用の配列に値をコピーして使うことになる。処理時間を測定するためにDateTimeクラスの変数を2つ用意する。

 次に、btnSortコントロールのClickイベント・ハンドラを書く。マスター・データをそれぞれの作業用の配列、あるいはDataGridViewコントロールにコピーした後、ラジオ・ボタンの状態によって、それぞれの方法で並べ替えを実行するプロシージャを呼び出すだけでいい。

Private Sub sortArray(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort.Click
  Dim i As Integer
  Dim ret As Integer

  ' どの方法でも同じデータが使われるようにするためマスターをコピー
  Array.Copy(fKeyMaster, fKey, 10000)
  Array.Copy(iDataMaster, iData, 10000)

  ' DataGridViewのデータを初期化する
  dgvWork.Rows.Clear()
  If rbDataGrid.Checked = True Then
    ' DataGridViewにデータを入れる(時間はかかるが我慢)
    For i = 0 To 9999
      ret = dgvWork.Rows.Add()
      dgvWork.Rows(ret).Cells(0).Value = fKeyMaster(i)
      dgvWork.Rows(ret).Cells(1).Value = iDataMaster(i)
    Next
  End If

  ' 振り分け
  If rbSort.Checked = True Then
    sortArray1() ' SortとReverseを使う方法
  ElseIf rbComparer.Checked = True Then
    sortArray2() ' IComparerを使う方法
  Else
    sortArray3() ' DataGridViewを使う方法
  End If
End Sub
btnSortコントロールのClickイベント・ハンドラ
  マスターのキー配列を作業用のキー配列にコピーする。
  マスターのデータ配列を作業用のデータ配列にコピーする。
  dgvWorkコントロールに行を追加。
  追加した行の0列目にキーを入れる。
  追加した行の1列目にデータを入れる。
  以降で、ラジオ・ボタンの状態によって処理を振り分ける。

 ここでは、ArrayクラスのCopyメソッドに注目。配列を一発コピーできる便利なメソッドだ。書き方は、

 Array.Copy(コピー元配列, コピー先配列, データ数)

となる。なお、Copyメソッドでは、コピー元の配列とコピー先の配列のデータ型が異なっても、数値の精度が落ちないように自動的に型変換される(精度が落ちる場合はエラーとなる)。


 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