Skip to main content

多次元配列

ObjectScript では、何らかの形で関連する値を格納し、操作するために使用できる、多次元配列がサポートされています。多次元配列は、ObjectScript および InterSystems IRIS® データ・プラットフォームで広範囲にわたってサポートされています。

クラスベースの代替手段もあります。

概要と用語

多次元配列は、1 つ以上のノードで構成される構造であり、各ノードは一意の添え字または添え字のセットで識別されます。例えば、MyVar 配列は以下のノードで構成できます。

  • MyVar

  • MyVar(22)

  • MyVar(-3)

  • MyVar(“MyString”)

  • MyVar(-123409, “MyString”)

  • MyVar(“MyString”, 2398)

  • MyVar(1.2, 3, 4, “Five”, “Six”, 7)

配列の各ノードは ObjectScript 変数で、任意のタイプの単一値を保持します。ノードは、添え字のない変数の場合とまったく同じ方法で操作できます。ObjectScript には、配列自体を操作する特殊な関数が用意されており、配列を検索したり、その一部を選択的に削除したり、構造全体に適用できるその他のアクションを実行できます。

多次元ツリー構造

多次元配列の全体的な構造は ツリー と呼ばれ、上から下に拡張します。ルート、上記の MyVar が頂点です。ルートと他の添え字が付いた形式を ノード と呼びます。下にノードを持たないノードは、と呼ばれます。下にノードを持つノードは、先祖と呼ばれます。親を持つノードは、子孫と呼ばれます。また、同じ親を持つ子は兄弟と呼ばれます。すべての兄弟がツリーに追加されると、数値あるいはアルファベット順で自動的に並べ替えられます。

スパース多次元ストレージ

多次元配列はスパース (まばらな) 配列です。つまり、上記の例では、それぞれ定義されたノードに対し、7 つのメモリ位置のみを使用しています。また、配列を宣言したり、ディメンジョンを指定したりする必要がないため、以下のようなメモリに関する利点があります。すなわち、多次元配列に対しては事前に予約される領域がない、多次元配列は必要になるまで領域を使用しない、および多次元配列が使用する領域はすべて動的に割り当てられる、の 3 点です。例えば、配列を使用して、チェッカーと呼ばれるゲームでのプレーヤの区画を追跡するとします。チェッカーボードは、8 × 8 です。8 × 8 のチェッカーボード・サイズの配列を必要とする言語では、チェッカーによって占められる位置が 24 個を超えることがないにもかかわらず、64 個のメモリ位置が使用されます。一方で、ObjectScript では、配列は最初に必要とする位置は 24 個となり、必要な位置はゲームの進行と共にさらに少なくなります。

多次元配列がサポートされる領域

ローカル変数プロセス・プライベート変数、およびグローバル変数はすべて、多次元配列にすることができます。ロック名も多次元配列にすることができます。これらの項目を多次元配列として宣言する必要はありません。

また、クラス内のプロパティは、その定義に MultiDimensional キーワードがあれば多次元配列にすることができます。例えば、以下のようになります。

Property MyProp as %String [ MultiDimensional ];

この宣言 (MultiDimensional キーワード) の目的は、クラスに対して生成されたコードに影響を与えることです。この種類のプロパティをデータベースに保存することはできません。

“項目を多次元配列としてサポートする” という表現は、項目の添え字を設定または参照することが構文的に有効であることを意味します。この考え方を別の言葉で表現すると、“項目が添え字を持つことを許可する” となります。

例えば、MyVar はローカル変数です。ローカル変数は多次元配列としてサポートされるため、次のようなコマンドを使用することは構文的に有効です。

 Set MyVar("test subscript")=45
 Write MyVar("test subscript")

"添え字のルール" で説明しているように、ここに示されている 1 つだけでなく、複数の添え字を使用できます。

添え字のルール

多次元配列の添え字のルールを以下に列挙します。

  • 添え字は数値または文字列にすることができます。添え字には Unicode 文字をはじめ、あらゆる文字を含めることができます。有効な数値の添え字は、正と負の数、ゼロ、および小数を含みます。

  • 空の文字列 ("") は有効な添え字ではありません

  • 添え字の値では大文字と小文字が区別されます。

  • 数値の添え字はキャノニック形式に変換されます。そのため、例えば、グローバル・ノード ^a(7)^a(007)^a(7.000)、および ^a(7.) はすべて同じです。これらすべてにおいて添え字は実際には同一であるためです。

  • 文字列の添え字はキャノニック形式に変換されません。そのため、例えば ^a("7")^a("007")^a("7.000")、および ^a("7.") では、添え字はすべて異なるため、これらはすべて異なるグローバル・ノードになります。また、^a("7") および ^a(7) はどちらも同じグローバル・ノードを参照します。これらの添え字は同じであるためです。

  • 配列ノードは複数の添え字を持つことができ、添え字は同じデータ型を持つ必要はなく、特定のシステムに従う必要もありません。

  • 添え字の長さと、添え字レベルの数には制限があります。"添え字の制限" を参照してください。

また、"一般的なシステム制限" も参照してください。

多次元配列の操作

InterSystems IRIS は、多次元配列と連動する包括的なコマンドと関数一式を提供します。

  • Set コマンドは、配列に値を設定します。

  • Kill コマンドは、配列構造のすべて、または一部を削除します。

  • Merge コマンドは、配列構造のすべてまたは一部を 2 番目の配列構造にコピーします。

  • $Order および $Query コマンドは、配列のコンテンツ全体に対して繰り返すことができます。

  • $Data コマンドは、配列内にノードが存在するかどうかをテストできます。

これらのコマンドの詳細は、"グローバルの操作" を参照してください。これは、グローバルとその他すべての種類の多次元配列に適用されます。

また、$QSUBSCRIPT 関数を使って、指定した変数のコンポーネント (名前と添え字) を返したり、$QLENGTH 関数を使って、添え字レベルの数を返すことができます。

クラスベースの配列

多次元配列ではなく、別の構造を使用し、オブジェクトベースの API を提供する配列クラスを使用できます。InterSystems IRIS では、配列形式のクラス・プロパティとして使用できる一連のクラスや、スタンドアロン配列に使用できる別の一連のクラスを提供しています。

関連項目

FeedbackOpens in a new tab