配列

このセクションでは、Curl® 言語の配列について説明します。具体的には、以下の項目について説明します。

配列の概要

配列は順序よく並んだ項目の集まりです。配列の各要素には、関連付けられたインデックスがあります。このインデックスを使用して配列の要素にアクセスできます。配列の 1 番目の要素には、0 のインデックス (0) が振られ、後の要素ごとにインデックスは 1 つずつ増加します。いくつかのプログラミング言語と異なり、配列の作成時に配列内の要素数を指定する必要はありません。たとえば、次の例のように配列には文字列要素が 3 つあります。
配列

要素

インデックス

Apple

Banana

Cherry

 

 

 

0

1

2

3

4

5

Figure: 文字列の要素が三つ入っている配列
この配列では、1 番目の要素はインデックスが 0 で、2 番目の要素がインデックス 1 3 番目の要素はインデックスが 2 になります。1 番目の要素には文字列 Apple、2 番目の要素には Banana、3 番目の要素には Cherry がそれぞれ含まれます。
配列を初期化すると、要素を配列に追加することができます。たとえば、文字列 Orange を前述の配列の最後に追加すると、次図のようになります。
配列

要素

インデックス

Apple

Banana

Cherry

Orange

 

 

0

1

2

3

4

5

Figure: 配列に要素を追加する
配列内の要素を変更するには新しい値を要素に代入します。たとえば、文字列 Grape を要素 2 に代入すると、配列は次図のようになります。
配列

要素

インデックス

Apple

Banana

Grape

Orange

 

 

0

1

2

3

4

5

Figure: 配列の要素を変更する
注意:コレクションを反復処理中にコレクションの内容が変更される場合は、その結果は定義されません。

配列の作成

Array-of クラスを使用して配列を作成することができます。Array-of クラスはパラメータ化クラスです。クラスを指定する際、配列内の要素のデータ型を示すパラメータが必要です。たとえば、次のコードではいくつかの配列が宣言されています。
{do
    let my-array-1:#{Array-of int}
    let my-array-2:#{Array-of String}
    let my-array-3:#{Array-of char}
}
注意: 上記の宣言内の # は、変数が null 値であること (つまり、値を持つことができない) または配列の可能性があることを示しています。変数が null 値であることを示すには、宣言内に # を指定する必要があります。それ以外の場合は、Curl® 実行環境 (RTE) は構文エラーをスローします。
配列のインスタンスの作成時に、要素のデータ型を示すパラメータを指定する必要もあります。配列のインスタンスを作成するには new を呼び出し、1 番目のパラメータとしてパラメータ化クラスの仕様、残余引数として配列内の初期要素をそれぞれ指定します。RTE は配列を作成して、残余引数を配列内に順に配置します。以下の例では、三つの要素を含む文字列の配列を生成します。インデックス 0 にある要素には、 Apple が含まれています。(配列の最初の要素のインデックスは 0 であることに留意してください。) インデックス 1 には Banana が、そしてインデックス 2 には Cherry が含まれています。 その次の行では、二つの要素を含む整数の配列があります。 最終行では、要素のない文字の配列が生成されています。 この配列には後に要素を追加することができることに留意してください。
{do
    {new {Array-of String}, "Apple", "Banana", "Cherry"}
    {new {Array-of int}, 14, 69}
    {new {Array-of char}}
}
他のオブジェクトと同様、クラスのインスタンスの作成時には new キーワードの使用を推奨しますが、オプションになります。new キーワードを省略する場合は、必ずパラメータ化クラスの仕様と残余引数間のカンマも省略してください。次に例を示します。
{do
    {{Array-of String} "Apple", "Banana", "Cherry"}
    {{Array-of int} 14, 69}
    {{Array-of char}}
}
コンストラクタ Array-of.clone-from を使用して、他の配列で初期化された値の入っている新しい配列を作成することができます。

要素の追加

Array-of パラメータ化クラスは配列を実装しています。このクラスには配列に要素を追加するいくつかのメソッドがあります。配列アクセス式と一緒に set 文を使用しないで、それらのメソッドを使用することができます。
メソッド要約
Array-of.append配列の最後に要素を追加します。
例:{my-array.append "Orange"}
Array-of.concat配列の最後に他の配列をすべて追加します。
例: {my-array-1.concat my-array-2}
Array-of.insert指定したインデックスの前に要素を挿入します。
例: {my-array.insert "Orange", 4}
Array-of.set配列の要素に値を設定します。
例: {my-array.set 3, "Orange"}
Array-of.splice配列の指定した場所に他の配列を挿入します。
例: {my-array-1.splice my-array-2, 1}

要素へのアクセス

要約:
  • 配列アクセス式を使用します (array-name[index])。
  • foruntil または while などのループ式を使用します。
  • コンテナ for ループを使用します ({for element[:type] in array-name do code})。
  • 直接配列アクセス メソッドを使用します。
配列内の要素にアクセスする 1 つの方法として、配列アクセス式の使用があります。配列アクセス式は次の形式になります。
array-name[index]
ここで array-name は配列名で index はアクセスする要素のインデックスです。次に例を示します。

例: 配列アクセス式
{value
    || Declare and initialize an array.
    let my-array:{Array-of String} =
    {new {Array-of String}, "Apple", "Banana", "Cherry"}

    || Return the element at index 2 in the array.
    || Remember that the first element in an array is at
    || index 0.
    my-array[2]
}
ループ式のコンストラクト」のセクションで説明しているループ式を使用して配列の要素にアクセスすることができます。たとえば、until ループを使用して配列の要素にアクセスできます。.この場合、配列の各要素にアクセスするにはループ インデックス変数を使用する必要があります。最初に、ループ インデックス変数にゼロ (0) を設定します。ループの繰り返しごとに、ループ インデックス変数が増加します。この章の後半で説明する size ゲッターを使用すると、ループの実行を終了する条件を決定することができます。次に例を示します。

例: loop 式を使用して配列要素にアクセス
{value
    || Declare and initialize an array.
    let my-array:{Array-of String} =
    {new {Array-of String}, "Apple", "Banana", "Cherry"}

    || Declare and initialize a VBox that we will use to
    || display the contents of the array.
    let message:VBox = {VBox}

    || Declare and initialize the loop index variable.
    let index:int=0

    || While the loop index variable is less than the size
    || of the array, add the element to the VBox and
    || increment the loop index variable.
    {while index < my-array.size do
        {message.add my-array[index]}
        set index = index + 1
    }
    || Note that the size getter returns the number of
    || elements in the array.  Because first element in
    || the array is at index 0, the last element in the
    || array will be at index (size - 1).
    || Also note that because size is a getter, we do
    || not have curly braces around the call to size.

    || Display the VBox.
    message
}
配列の全要素にアクセスする便利な方法として、コンテナ for ループの使用があります。配列の各要素に対して、コンテナ for ループは変数に要素を代入し、その要素の一連の式を評価します。配列を使用する際の、コンテナ for ループは次の形式になります。
{for element[:type] in array-name do
    code
}
説明:
コンテナ for ループに遭遇すると、array-name のそれぞれの要素について code を実行します。code の処理の繰り返しごとに RTE は element-value に該当する要素の値を代入します。次に例を示します。

例: 配列に for ループを使用
{value
    || Declare and initialize an array.
    let my-array:{Array-of String} =
    {new {Array-of String}, "Apple", "Banana", "Cherry"}

    || Declare and initialize a VBox that we will use to
    || display the contents of the array.
    let message:VBox = {VBox}

    || For each element in the array, add the element
    || to the VBox.
    {for element:String in my-array do
        {message.add element}
    }

    || Display the VBox.
    message
}
コンテナ for ループの詳細については、ループ構築のセクションの「コンテナ ループ」を参照してください。
Array-of パラメータ化クラスには、配列内の要素に直接アクセスできるメソッドが含まれています。配列アクセス式を使用せずに、次のいずれかのメソッドで要素にアクセスすることができます。
メソッド要約
Array-of.find配列内の特定の要素を検索します。
例: {my-array.find "Cherry"}
Array-of.get配列の指定したインデックスの要素を返します。
例: {my-array.get 2}

要素の修正

上述したように、set 文を配列アクセス式と共に使用することで要素を修正することができます。次に例を示します。
{do
    set my-array[2] = "Grape"
}
Array-of パラメータ化クラスには、配列の要素を修正するいくつかのメソッドが含まれています。配列アクセス式に加えて、これらのメソッドを使用して要素を修正することができます。
メソッド要約
Array-of.clear配列から要素をすべて削除します。
例: {my-array.clear}
Array-of.filter配列の要素をフィルターし、プロシージャを要素に適用します。
例:
{my-array.filter
    {proc {str:String}:bool
        {return str[0] != 'a'}
    }
}
Array-of.filter-clone
配列の要素をフィルターし、要素にプロシージャを適用したクローンを作成します。
例:
set new-array =
    {my-array.filter-clone
        {proc {str:String}:bool
            {return str[0] != 'a'}
        }
    }
Array-of.filter-keys配列の要素をフィルターし、キーにプロシージャを適用します。
例:
{my-array.filter-keys
    {proc {index:int}:bool
        {return (index mod 2) == 0}
    }
}
Array-of.filter-keys-clone配列の要素をフィルターし、キーにプロシージャを適用したクローンを作成します。
例:
set new-array =
    {my-array.filter-keys-clone
        {proc {index:int}:bool
            {return (index mod 2) == 0}
        }
    }
Array-of.remove1 つ以上の要素を配列から削除します。
例: {my-array.remove 2}
Array-of.reverse配列の要素の順序を反転します。
例: {my-array.reverse}
Array-of.set配列内の要素に値を設定します。
例: {my-array.set 3, "Orange"}
Array-of.sort配列の要素を順番に並べます (デフォルト順序は昇順です)。
例: {my-array.sort}
Array-of.splice配列内の指定した場所に他の配列を挿入します。
例: {my-array-1.splice my-array-2, 1}
以上の全メソッドや使用例の詳細については、『API リファレンス』を参照してください。

スタックとして配列を処理

配列を作成し、配列を後入れ先出し列として処理することができます。Array-of クラスには、スタック演算をサポートする次のメソッドが含まれています。
メソッド要約
Array-of.pop配列の最後の要素を削除し、値を返します。
例:{my-array.pop}
Array-of.push配列の最後に要素を追加します。
例:{my-array.push "Orange"}
Array-of.top-of-stack配列の最後の要素を返します。
例: {my-array.top-of-stack}
以上の全メソッドや使用例の詳細については、『API リファレンス』を参照してください。

その他の演算

Array-of パラメータ化クラスには、配列の他の演算を実装するいくつかのメソッドが含まれています。メソッドは次のとおりです。
メソッド要約
Array-of.element-type配列要素のデータ型を返します。
例: my-array.element-type
Array-of.empty?配列が空かどうかを調べます。
例: my-array.empty?
Array-of.equal?配列が他の配列と等しいかどうかを調べます。
例: {my-array-1.equal? my-array-2}
Array-of.in-bounds?インデックスが有効かどうかを調べます。
例: {my-array.in-bounds? 2}
Array-of.get-key与えられたキー (インデックス) を返します。
例: {my-array.get-key 0}
Array-of.key-exists?キー (インデックス) が存在するかどうかを調べます。
例: {my-array.key-exists? 2}
Array-of.keys-to-Iterator連続したインデックスを含む Iterator-of を返します。
例: {my-array.keys-to-Iterator}
Array-of.sizeゲッターは配列のサイズを返します。
例: my-array.size
Array-of.set-size配列のサイズを設定するメソッド。
例: {my-array.set-size 3}
Array-of.to-Iterator連続した要素を含む Iterator-of を返します。
例: {my-array.to-Iterator}

配列のクローン

クローンとは、self と同じデータ型を持つ新しいオブジェクトです。クローンには、self の浅い要素のコピーが含まれます。つまり、どちらかの集合の要素に新しいオブジェクトを代入すると、もう一方の一致した要素は元のオブジェクトを参照します。ただし、要素のオブジェクトを変更すると、両方の集合は変更したオブジェクトを参照します。 Array-of を使用してクローンを生成することができます。
メソッド要約
Array-of.cloneクローンを作成します。
例: set new-array = {my-array-1.clone}
Array-of.clone-rangeある要素の範囲でクローンを作成します。範囲の開始位置と要素数を指定します。
例: set new-array = {my-array-1.clone-range 2, 4}
Array-of.filter-clone配列の要素をフィルターし、要素にプロシージャを適用したクローンを作成します。
例:
set new-array =
    {my-array.filter-clone
        {proc {str:String}:bool
            {return str[0] != 'a'}
        }
    }
Array-of.filter-keys-clone配列の要素をフィルターし、キーにプロシージャを適用したクローンを作成します。
例:
set new-array =
    {my-array.filter-keys-clone
        {proc {index:int}:bool
            {return (index mod 2) == 0}
        }
    }

FastArray

FastArray-of パラメータ化クラスの機能は制限されているが、配列を効率的に実装します。このクラスは、他のすべての配列の内部表現を実装しています。
FastArray-of は他の配列クラスよりも早く要素にアクセスすることができます。ただし、FastArray-of の最大のサイズは配列を決定する際に設定する必要があり、最大値は後で変更することはできません。利用できるメソッドもあまり多くありません。具体的には、FastArray-of クラスには次のアクセス関数とメソッドが含まれています。
メソッド要約
FastArray-of.appendFastArrayの最後に要素を追加します。
例: {my-array.append "Orange"}
FastArray-of.cloneクローンを作成します。
例: set new-array = {my-array-1.clone}
FastArray-of.clone-only最小の max-size でクローンを作成します。
例: set new-array = {my-array-1.clone-only}
FastArray-of.clone-rangeある要素の範囲でクローンを作成します。範囲の開始位置と要素数を指定します。
例: set new-array = {my-array-1.clone-range 2, 4}
FastArray-of.concat現在のFastArrayの最後に、他のFastArrayの要素をすべて追加します。
例: {my-array-1.concat my-array-2}
FastArray-of.copy-into要素を他のFastArrayにコピーします。
例: {my-array-1.copy-into my-array-2}
FastArray-of.getFastArrayの指定したインデックスの要素を返します。
例: {my-array.get 2}
FastArray-of.insert指定したインデックスの前に要素を挿入します。
例: {my-array.insert "Orange", 4}
FastArray-of.popFastArrayの最後の要素を削除し、値を返します。
例: {my-array.pop}
FastArray-of.pushFastArrayの最後に要素を追加します。
例: {my-array.push "Orange"}
FastArray-of.remove1 つ以上の要素をFastArrayから削除します。
例: {my-array.remove 2}
FastArray-of.reverseFastArrayの要素の順序を反転します。
例: {my-array.reverse}
FastArray-of.setFastArray内の要素に値を設定します。
例: {my-array.set 3, "Orange"}
FastArray-of.sortFastArrayの要素を順番に並べます (既定の順序は昇順です)。
例: {my-array.sort}
FastArray-of.splice現在のFastArrayの指定した場所に他のFastArrayを挿入します。
例: {my-array-1.splice my-array-2, 1}
FastArray-of.equal?FastArrayが他のFastArrayと等しいかどうかを調べます。
例: {my-array-1.equal? my-array-2}
FastArray-of.in-bounds?インデックスが有効かどうかを調べます。
例: {my-array.in-bounds? 2}
FastArray-of.sizeゲッターは配列のサイズを返します。
例: my-array.size
FastArray-of.set-size配列のサイズを設定するメソッド。
例: {my-array.set-size 3}
FastArray-of.top-of-stackFastArrayの最後の要素を返します。
例: {my-array.top-of-stack}
アクセッサとメソッドの全リストについては、『API リファレンス』の FastArray-of のセクションを参照してください。

2 次元配列

Array-2-of パラメータ化クラスを使用して、2 次元配列を作成することができます。クラスを指定する際、配列内の要素のデータ型を示すパラメータを指定する必要があります。このクラスのインスタンスを作成する際に、2 次元配列のサイズを指定する必要があります。たとえば、次のコードでは 2 x 3 の文字列配列を宣言し、初期化しています。
{do
    || Create a two-dimensional array of String.
    let my-array:{Array-2-of String} =
        {new {Array-2-of String}, 2, 3}
}
2次元配列では、配列アクセス式は次の形式になります。
array-name[dimension-1, dimension-2]
次のように上記の 2 次元配列に要素を割り当てることができます。
{do
    || Fill the array with elements.
    set my-array[0, 0] = "Harry"
    set my-array[1, 0] = "Sally"
    set my-array[0, 1] = "Tom"
    set my-array[1, 1] = "Mary"
    set my-array[0, 2] = "John"
    set my-array[1, 2] = "Anne"
}
Array-2-of クラスには、次のアクセッサとメソッドが含まれています。
メソッド要約
Array-2-of.clear配列から要素をすべて削除します。
例: {my-array.clear}
Array-2-of.cloneクローンを作成します。
例:
set new-array = {my-array-1.clone}
Array-2-of.element-type配列要素のデータ型を返すアクセッサ。
例: my-array.element-type
Array-2-of.empty?配列が空かどうかを調べるアクセッサ。
例: my-array.empty?
Array-2-of.equal?配列が他の配列と等しいかどうかを調べます。
例: {my-array-1.equal? my-array-2}
Array-2-of.filter配列の要素をフィルターし、プロシージャを要素に適用します。
例:
{my-array.filter
    {proc {str:String}:bool
        {return str[0] != 'a'}
    }
}
Array-2-of.filter-clone配列の要素をフィルターし、プロシージャを適用した要素のクローンを作成します。
例:
set new-array =
    {my-array.filter-clone
        {proc {str:String}:bool
            {return str[0] != 'a'}
        }
    }
Array-2-of.get配列の指定したインデックスの要素を返します。
例:{my-array.get 2}
Array-2-of.in-bounds?インデックスが有効かどうかを調べます。
例:{my-array.in-bounds? 2}
Array-2-of.set配列内の要素に値を設定します。
例:{my-array.set 3, "Orange"}
Array-2-of.set-size配列のサイズを設定します。
例:{my-array.size 3}
Array-2-of.size配列の要素数を返します。
例:{my-array.size}
Array-2-of.to-Iterator連続した要素を含む Iterator-of を返します。
例:{my-array.to-Iterator}
アクセッサとメソッドの全リストについては、『API リファレンス』の Array-2-of の項目を参照してください。

その他の配列型

Curl 言語には他の配列型がいくつかあります。これらの配列は上記の配列クラスの特殊なバージョンになります。次のクラスが含まれます。