はじめに
今回は、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 | 指定インデックスの位置に、複数要素の挿入を行う |

