|
||||
|
|
6章 配列
|
|
|
配列とは、、
複数の値をまとめて扱う場合に1〜2つ程度であれば前章で説明したように変数を使用すれば問題ないとおもいます。 しかし扱うデータが100個になった場合はどうでしょう!? [ 変数を100個宣言して、、] なんてしていてはとても大変です。 こんな時には通常は [ 配列 ] と呼ばれるものを使用します。
配列とは複数の変数の集合を表わします。 宣言時に使用する要素数を指定ます。 ( 要素数を初めに指定せず動的に配列のサイズを変更する事も可能です ) またアクセス時は要素番号を指定して各要素にアクセスします。 ASPで配列を使用する場合は宣言時に (次元数) ををつける事で作成します。 配列の宣言、参照のサンプル
' 配列の宣言 Dim week(6) '0〜6の7要素を持つ配列が作成されます。 ' 要素への代入 week(0) = "sun" week(1) = "mon" week(2) = "tue" week(3) = "wed" week(4) = "thu" week(5) = "fri" week(6) = "sat" ' 要素の参照 Response.Write(week(0)) 'sunと出力 Response.Write(week(6)) 'satと出力 [ 上記を図解すると・・・ ]
配列を使用しない場合 [ 10個の変数を0で初期化する ]
a1 = 0 a2 = 0 a3 = 0 a4 = 0 ↓ a10 = 0 [ 100個の変数を表示させる ]
Response.Write(a1) Response.Write(a2) Response.Write(a3) Response.Write(a4) ↓ Response.Write(a100) 配列を使ってみる
配列に関するイメージはとらえて頂けたと思います。
では今度は実際に配列でプログラムを作成してみましょう。 T) 10個の変数を数値0〜9で初期化する
Dim Arr(9) For cnt = 0 To 9 Arr(cnt) = cnt Next U) 10個の変数を表示させる
For cnt = 0 To 9 Response.Write(Arr(cnt)) Next 例T では 10個の要素を持つ配列を宣言 ( Dim Arr(9) ) し、For 文を使用して配列の要素0〜9にそれぞれ0〜9を代入しています。 例U はTで設定した値を参照しています 0〜9が順に出力されます。 上のサンプルを見ていただくと分かりますが、配列の要素は0から始まります。 宣言時に9とした場合は0〜9の10個の要素をもつ配列を作成すると言う意味になります。Perl・Javascriptではエラーになりませんでしたが、VBScriptでは範囲外の要素の指定にアクセスした場合はエラーとなりますので注意してください。
'範囲外にアクセスしたため実行時エラーとなる Response.Write(Arr(10)) 動的配列
今までは本当に基本的な配列の操作方法について見てみましたが。しかし「データが何件あるか分からないけど、配列を使用してプログラムを作成したい」 といった場合はどうすれば良いのでしょうか?? 手段としては宣言時に確実にある数値以上は要素が増えなければその確実な値を設定すれば良いわけです。しかし、実際は75要素しか持たない配列なのに100個の要素を用意しておくのはメモリを無駄に確保してしまいあまり効率的とは言えません。
こんな時に VBScript では [ 動的配列 ] と呼ばれる機能を使用する事が出来ます。今まで説明してきた配列が宣言時に領域を確保する [ 静的配列 ] に対して、実行時に配列のサイズを変更できる動的な配列のを事をそう呼びます。 動的配列の宣言
Dim Arr() '//要素数を指定しない
要素数の指定
ReDim Arr(9) '//ReDimステートメントを指定してサイズを設定
動的配列を宣言した時は配列を使用する前に ReDimステートメントで配列のサイズを指定する必要があります。このステートメントを実行するまで、動的配列へのアクセスは出来ません。 [ 動的サンプル ]
'# 動的配列の宣言 Dim Arr() '# 配列の要素数を10に設定 ReDim Arr(9) '# 配列0〜9を0〜9で初期化 For cnt = 0 To 9 Arr(cnt) = cnt Next '# 配列の要素数を20に設定 ReDim Arr(19) '# 配列10〜19を10〜19で初期化 For cnt = 10 To 19 Arr(cnt) = cnt Next '# 配列0〜19の値を表示 For cnt = 0 To 19 Response.Write(Arr(cnt)) Next 6で出力される結果は当然 0〜19 となるはずですね。しかしこのサンプルでは10〜19としか出力されません。これは何故かと言うと ReDim ステートメントを実行した時点で配列の要素はクリアされてしまうからです。つまり2回目の ReDim の時点で配列0〜9に格納されていた値はクリアされてしまっているのです。 しかしこれでは不便なケースも多々あります。こんな時は2回目のReDimを次のように変更してみてください。
ReDim Preserve Arr(19)
Preserve キーワードはサイズ変更を行った配列に要素を再保存する事ができます。これで0〜19と表示されるようになります。 ただし ReDim キーワードは要素数を指定して宣言した配列には使用する事は出来ないので注意してください。 配列の作成方法
これまで新たに変数を宣言してから新規の配列を作成する方法を説明てきました。今回はちょっと違った配列の作成方法を見ていきましょう。
列のコピーを作成する
Dim Arr(9) Dim Arr2 For cnt = 0 To 9 Arr(cnt) = cnt Next '# 配列をコピーする Arr2 = Arr '# 9が出力される Response.Write(Arr2(9)) このサンプルでは配列をコピーしてまったく同じ配列をもう一つ作成しています。最後の出力では配列 Arr に格納されている値と同じ値が出力されると思います。 しかし、このサンプルは Arr2 を配列として宣言してしまうと実行時エラーになります。コピー元とコピー先の配列のサイズが同じでも、動的配列でもエラーとなってしまいますので注意してください。 区切り文字列を配列に変換する
Dim Arr Arr = "SUN,MON,TUE,WED,THU,FRI,SAT" '# Split関数で配列に変換 Arr = Split(Arr,",") Response.Write(Arr(2)) Arrは通常のバリアント型の変数として宣言されて、値にカンマ "," 区切りのデータを代入しています。このサンプルも上の例同様 Arr2 を配列として宣言したり、Arr2が動的配列でもエラーとなってしまいますので注意してください。 配列の操作配列操作関数
Array
[配列] = Array ( 値1 , 値2 , 値3 , 値4 , 値5 )
引数はカンマ","で区切って指定します。Array関数は受け取った引数を配列に変換して戻します。上の例では値1→0番目、値2→1番目の要素になります。 IsArray
IsArray ( 対象変数 )
対象変数が配列か否かを判断して真/偽を返します。 UBound
[ 最大要素番号 ] = UBound ( 対象配列 , [次元] )
配列で指定可能な最大の要素番号を返します。後述する多次元配列用に次元番号を指定する事が出来ます。 LBound
[ 最小要素番号 ] = LBound ( 対象配列 , [次元] )
配列で指定可能な最小の要素番号を返します。後述する多次元配列用に次元番号を指定する事が出来ます。 Join
[ 文字列 ] = Join ( 対象配列 , [区切り文字] )
対象配列を区切り文字で結合して文字列を返します。区切り文字を指定しなかった場合、デフォルト値としてスペース [ " " ] を区切り文字として配列の文字列を結合します。 Split
[配列] = Split ( 文字列 , [区切り文字] , [要素数] , [比較モード] )
対象変数を区切り文字で分割して配列を作成してその配列を返します。区切り文字を指定しなかった場合、デフォルト値として、スペース [ " " ] を区切り文字として配列を作成します。
Filter
[配列] = Filter ( 対象配列 , 検索文字列 , [条件] , [比較モード] )
対象配列から指定された検索文字列を含む(または含まない)配列を抽出して、その配列を結果として返します。
配列の全ての要素に処理を行う
For Each を使用する
Dim varData Dim Arr Arr = "SUN,MON,TUE,WED,THU,FRI,SAT" '# Split関数で配列に変換 Arr = Split(Arr,",") For Each varData In Arr Response.Write(varData & "<br>") Next For Each ステートメントは配列を要素0から順に参照して値を For Each で指定した変数に代入してくれる便利な構文です。しかも全ての要素を参照し終わった時点でこの For Each ブロックは自動的に終了してくれます。 今回は配列に対する使い方として For Each ステートメントを紹介していますが、コレクションに対する操作としても非常に有用です。 For を使用する
Dim intCnt Dim Arr Arr = "SUN,MON,TUE,WED,THU,FRI,SAT" '# Split関数で配列に変換 Arr = Split(Arr,",") For intCnt = 0 To UBound(Arr) Response.Write(Arr(intCnt) & "<br>") Next 前述した UBound関数を使用しています。この関数は引き数で指定した配列で参照できる最大の値を戻り値として返してくれます。それを利用して 0 から配列の最大値( UBound関数の戻り値 ) まで繰り返しを実行します。個々の要素へのアクセスは For ステートメントによって自動的に加算されている intCnt を添え字としています。 平均を求めるプログラムを作ってみる
Dim Sum Dim Arr Dim varData Arr = Array(1,2,3,4,5,6,7,8,9,10) For Each varData In Arr Sum = Sum + varData Next Response.Write("平均値は " & Sum / (UBound(Arr)+1) & " です。") 先ず For Each ステートメントを実行して配列に含まれる全ての値を合算します。集計が終わったところで UBound 関数で要素数を求めて( UBound 関数は参照できる最大の添え字数を返すので、サンプルでは 戻り値 + 1 をしています。)先ほど集計した合算値を除算しています。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||