連載:VB 6ユーザーのための
|
|
|
サンプル・プログラム8 − 降順に並べ替えるいくつかの方法
.NET Frameworkクラス・ライブラリのリファレンスを見てみると、ArrayクラスのSortメソッドでは並べ替えの順序が指定できるらしいということは分かる。が「IComparerインターフェイスを使う」とあり、これがなかなか手ごわそうだ(実際、手ごわい)。いずれ、その方法に取り組む必要は出てくるのだろうが、できれば、これまでの知識の延長で済ませたいと思うのが人の子。自分で並べ替えのコードを書くのもできるだけ避けたい。
そこでもう少しリファレンスを見てみる。すると、降順に並べ替えるためのメソッドはないが、順序を逆転させるためのReverseというメソッドがあることに気付く。ここで、頭の中の電球がパッと光るはず。
Array.Sortで昇順に並べ替えてから、Reverseメソッドで逆順にすれば、降順になる
というわけだ。
あまりに簡単なので、これは悪魔のささやきなのでは? という感もあるが、確実にできることは確かだろう。では、これで……と思うのだが、今度は天使が割り込んでくる。
IComparerインターフェイスを使った方法で正面からいくべき
と。確かに、数値だけの場合はReverseメソッドでも問題はないが、文字列を扱うようになってくると、並べ替えの順序も重要になってくる。IComparerインターフェイスを使えば、例えば、ロケールの違いや大文字と小文字を区別した並べ替えもできる。先のことを考えると、いま、少し苦労しておくのもいい。
そういうせめぎ合いの中、頭の中に第三の登場人物が現れる。文化人類学的にいえば「道化」に当たる存在かもしれない。
DataGridViewコントロールを使えばいいじゃん
という別の発想だ。何もかもコードで書かなくても、せっかくいろんなコントロールが用意されているのだから、それを作業用に使えばいい。ユーザー・インターフェイスを作るためだけでなく、データ処理のための作業場所として使えばいいのではないか、というわけだ。
どの方法を採用するかは、学習にかかるコスト、コーディングの手間、保守性、拡張性、プログラムの処理速度などを総合して決定する必要がある。が、ともかく、この3つの方法でコードを書いてみて、それぞれ比較してみよう。
結果として得たいものが、サンプル・プログラム7のようなランダムな数列であれば、昇順に並べ替えようが、降順に並べ替えようが、どちらでも構わないので、並べ替えの結果そのものにはあまり意味はないのだが、同じようなプログラムで試してみることにする。
■フォームのデザイン
フォームのデザインは、ここではあまり本質的な話ではないので、図示するだけにとどめておく(図5)。3つの方法で並べ替えを実行したときにかかった時間を[結果:]の下に表示する。
図5 降順に並べ替える方法を比較するための画面 | ||||||||||||
|
■コードの記述 〜 配列の準備から並べ替えの方法を選択するまで
公平を期するために、3つの方法で同じデータを使うようにする。そのため、キーとなる乱数の配列とデータ配列のマスターを用意しておく。プログラムに少し負荷をかけるために、要素の数は10000としておこう。ここではフォームをロードしたときに、このマスターとなる配列を作成する。
| |
フォームのLoadイベント・ハンドラ | |
サンプル・プログラム7とほぼ同じ。違う点は、配列のマスター・データを作っておくこと。それぞれの方法で並べ替えを実行するときには、マスター・データから検証用の配列に値をコピーして使うことになる。処理時間を測定するためにDateTimeクラスの変数を2つ用意する。 |
次に、btnSortコントロールのClickイベント・ハンドラを書く。マスター・データをそれぞれの作業用の配列、あるいはDataGridViewコントロールにコピーした後、ラジオ・ボタンの状態によって、それぞれの方法で並べ替えを実行するプロシージャを呼び出すだけでいい。
| ||||||||||||||||||
btnSortコントロールのClickイベント・ハンドラ | ||||||||||||||||||
|
ここでは、ArrayクラスのCopyメソッドに注目。配列を一発コピーできる便利なメソッドだ。書き方は、
Array.Copy(コピー元配列, コピー先配列, データ数)
となる。なお、Copyメソッドでは、コピー元の配列とコピー先の配列のデータ型が異なっても、数値の精度が落ちないように自動的に型変換される(精度が落ちる場合はエラーとなる)。
INDEX | ||
連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門 | ||
第6回 配列ってこんなに便利だったの!? | ||
1.サンプル・プログラム7 − ランダムな並べ替えのためのコード | ||
2.サンプル・プログラム8 − 降順に並べ替えるいくつかの方法 | ||
3.並べ替えを行う3つの方法を実装 | ||
「これならマスターできるVB 2005超入門」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -