はじめに
今回は、Curl言語のコレクションについて説明します。コレクションは、同じ型のデータを集めたものです。各要素データの持ち方により、「配列」「ハッシュテーブル」「セット」の3種類がCurl言語により用意されています。これらの使い方について見ていきましょう。
配列
配列は、同じ型の変数を複数保持するリストです。各要素にアクセスするには、0から始まる保持順番(インデックス)を使用します。配列には機能によっていくつか種類があります。最も高機能なのは、Array-of クラスです。
let 変数:{Array-of 型} = {{Array-of 型} 要素0, 要素1, ...}
Array-of は、パラメータ化クラスになっています。そのために、型の指定は、{ } で囲む必要があります。新しいインスタンスを生成する場合は、内側の{ } が型を指定し、外側の { } がインスタンスの生成を表します。new を使った構文の方が意味は分かりやすいですね。
let 変数:{Array-of 型} = {new {Array-of 型}, 要素0, 要素1, ...}
型を指定することにより、その型だけを含むことができる配列が生成できます。すべての型を要素に含めるようにしたい場合は、{Array-of any} を使います。null値をとるような型指定が必要な場合は、#演算子を使って型指定をします。要素の型をnull値または文字列型に指定したい場合は、以下のようになります。
let string-array:{Array-of #String} = {{Array-of #String}}
具体的なサンプルコードを見てみましょう。配列に初期値として文字列 a、b、c を設定します。そして、各要素の文字列を連結した文字列を表示します。
{curl 7.0 applet} {curl-file-attributes character-encoding = "shift-jis"} {value let array:{Array-of String} = {{Array-of String} "a", "b", "c"} {array.get 0} & {array.get 1} & {array.get 2} }
実行結果は文字列 abc が表示されます。
指定した配列の要素にアクセスするために、[ ]を使った表記が利用できます。同じプログラムをgetメソッドの代わりに [ ] で書いてみます。
{curl 7.0 applet} {curl-file-attributes character-encoding = "shift-jis"} {value let array:{Array-of String} = {{Array-of String} "a", "b", "c"} array[0] & array[1] & array[2] }
Array-of のデフォルトコンストラクタで引数を指定しない場合は、要素がない状態(要素数が0)で生成されます。インスタンス生成後、要素を追加したい場合は、最後に追加する場合は append メソッド、追加する位置を index値で指定して挿入する場合は insert メソッドを使います。
{curl 7.0 applet} {curl-file-attributes character-encoding = "shift-jis"} {value let array:{Array-of String} = {{Array-of String} "b"} {array.insert "a", 0} {array.append "c"} array[0] & array[1] & array[2] }
実行結果は先ほどと同じ、文字列 abc が表示されます。
要素数を変えずに、値を変更したい場合、set メソッドもしくは setコマンドと [ ] で記述できます。
{curl 7.0 applet} {curl-file-attributes character-encoding = "shift-jis"} {value let array:{Array-of String} = {{Array-of String}} {array.append "a"} {array.append "b"} {array.append "c"} {array.set 1, "x"} set array[2] = "y" array[0] & array[1] & array[2] }
実行結果は、文字列 axy です。
要素を削除したい場合は、remove メソッドを使います。
{curl 7.0 applet} {curl-file-attributes character-encoding = "shift-jis"} {value let array:{Array-of String} = {{Array-of String} "a", "b", "c"} {array.remove 1} array[0] & array[1] }
実行結果は、文字列 ac です。このようにインデックス値が1の要素を削除した場合は、要素数が2つになりますから、array[0] と array[1] のみが存在します。array[2] のように存在しない要素を指定すると、以下のエラーが発生します。
<エラー> - このアプレットをロード中にエラーが発生しました。 ArrayBoundsException: 配列インデックスが境界外です。
Array-of の他に、機能を絞って高速に動作する FastArray-of があります。FastArary-of は、最大要素数を予め指定して使う必要があります。また、一度設定したら要素数や値を変更できない ReadOnlyArray-of があります。
プロパティ | 内容 |
---|---|
element-type | 要素の型 |
empty? | 要素が空か否か |
size | 要素の数 |
メソッド | 内容 |
---|---|
append | 配列の最後に要素を追加する |
clear | 配列の要素を全て削除する |
find | 配列の最初に一致した要素のインデックスを返す |
get | 指定したインデックスの要素を返す |
get-if-exists | 指定したインデックスの要素があるか否かと値を返す |
in-bounds? | 指定したインデックス値が有効な範囲か否かを返す |
insert | 指定したインデックス位置に要素を挿入する |
pop | 配列の最後から要素を削除して返す |
push | 配列の最後に要素を追加する |
remove | 指定インデックス位置の1つまたは複数の要素を削除する |
set | 指定インデックス位置の要素を設定する |
sort | 要素を並び替える |
splice | 指定インデックスの位置に、複数要素の挿入を行う |