#freeze
TITLE:配列
#contents
~
*配列の概要[#about]
Ver12.10.0で変数に配列が追加されました。
配列とは、変数に次元と要素を設けて、ひとつの変数で多くの変数値を扱うことを可能にするものです。
Light.vnでは、「リスト」と「ハッシュマップ」の2種類を用いることができます。
**要素[#contents]
配列における「要素」は、配列変数内に存在する個々の変数を指します。
リスト変数やハッシュマップ変数も要素として用いることができます。
-通常変数と同様に値(undefinedを含む)を持つ要素を、当Wikiでは「''終端要素''」と呼びます。
-1つの要素を指定する際には、後述の「インデックス」「キー」を変数名の末尾に記述します。
-ある要素の下に続く要素は「子要素」と呼びます。


**次元[#dimension]
配列における「次元」は、任意の要素が属する階層を指します。
通常変数は無次元ですが、''リストとハッシュマップは生成と同時に次元を1増加させます''。
一般的に、配列変数の次元は要素の最大次元を指します。
-たとえば、リスト変数を1回生成すれば、その変数は1次元となります。
その後、ある要素に対してハッシュマップ変数を生成すれば、変数は2次元となります。
-リストやハッシュマップの生成方法によっては、すべての終端要素の次元が統一されます。当Wikiではこれを「斉次」と呼びます。
終端要素の次元が統一されていないものは「非斉次」と呼びます。
-終端要素の次元を除くすべての次元において子要素数が同一であることを、当Wikiでは「要素均等」と呼びます。
子要素数が同一でない次元があることは「要素不均等」と呼びます。



*リスト[#list]
リストは、複数の要素を''「インデックス」と呼ばれる0からの連番で扱う''型です。
変数をリスト型にするには(そのような変数を「リスト変数」と呼びます)、LVN関数「lvCreateVarList」を用います。
ただし、システム変数や、すでにリスト・ハッシュマップ以外の型になっている変数をリスト型にすることはできません。


**インデックスと値[#list_index_and_value]
リスト変数は任意の個数の要素を持ち、各要素の値にはインデックスが関連付けられます。
インデックスはリストにおいて変数名と同様の役割を担います。

***インデックス[#list_index]
インデックスは、リスト内の各要素に関連づいた、0からの連番です。
-インデックスはリスト変数の変数名の末尾に「[]」で囲んで記述します。この大括弧は''数値または数値型の変数名''を囲みます。
インデックスは整数であるため、数値も整数に限られますが、小数型の整数でも問題はありません。
-複数のインデックスを並べて記述すると、インデックスの個数と同じ次元の要素を指定できます。
たとえば、3次元リスト変数において、任意の要素を指定する場合に用いるインデックスは最大で3個です。
-リスト変数は通常変数と同様に代入をすることができます。
指定したインデックスの要素が変数値である場合には、その変数が代入されます。
指定したインデックスの要素がリストである場合には、「"LIST"」が代入されます。
指定したインデックスの要素がハッシュマップである場合には、「"HASH_MAP"」が代入されます。

***要素のインデックス指定と値の定義・変更[#list_contents_select]
変数値の定義や代入等で要素を指定する際には、変数名の末尾にインデックスを付与したものを記述します。
例として、以下のような3次元リスト変数「temp00」を定義します。
|CENTER:|CENTER:|CENTER:|CENTER:|c
|>|>|インデックス|値|h
|0|0|0|undefined|
|~|~|1|3|
|~|1|0|5|
|~|~|1|7|
|~|2|0|9|
|~|~|1|"ぐぅすぅ"|
|1|0|0|0|
|~|~|1|2|
|~|1|0|4|
|~|~|1|6|
|~|2|0|8|
|~|~|1|"きぃすぅ"|
-1つだけある未定義の要素のインデックスは「[0][0][0]」です。
この要素の値を定義する際には、変数定義の左辺に「temp00[0][0][0]」を記述します。
たとえば、変数値「1」を定義する場合には以下のように記述します。
 変数 temp00[0][0][0] = 1
変更後のリスト変数「temp00」は以下のようになります。
|CENTER:|CENTER:|CENTER:|CENTER:|c
|>|>|インデックス|値|h
|0|0|0|COLOR(red):1|
|~|~|1|3|
|~|1|0|5|
|~|~|1|7|
|~|2|0|9|
|~|~|1|"ぐぅすぅ"|
|1|0|0|0|
|~|~|1|2|
|~|1|0|4|
|~|~|1|6|
|~|2|0|8|
|~|~|1|"きぃすぅ"|
-変数値「"きぃすぅ"」を持つ要素のインデックスは「[1][2][1]」です。
この要素の値を変更する際には、変数定義の左辺に「temp00[1][2][1]」を記述します。
たとえば、値を「"カズ"」に変更する場合には以下のように記述します(すでに型が文字列に定まっているため、文字列にのみ変更可能)。
 変数 temp00[1][2][1] = "カズ"
変更後のリスト変数「temp00」は以下のようになります。
|CENTER:|CENTER:|CENTER:|CENTER:|c
|>|>|インデックス|値|h
|0|0|0|1|
|~|~|1|3|
|~|1|0|5|
|~|~|1|7|
|~|2|0|9|
|~|~|1|"ぐぅすぅ"|
|1|0|0|0|
|~|~|1|2|
|~|1|0|4|
|~|~|1|6|
|~|2|0|8|
|~|~|1|COLOR(red):"カズ"|
-インデックス「[0][2][0]」は値「9」を指定します。
この要素の値を代入するには、代入変数として「temp00[0][2][0]」を記述します。
たとえば、「(temp00[0][2][0])」は「9.000000」となり、「{{temp00[0][2][0]}}」は「9」となります。


**生成方法[#list_define]

***1次元、要素未定義[#list_undefined]
 変数 temp01 = lvCreateVarList(2)
-引数に整数値(自然数)のみを指定すれば、1次元リストが生成されます。
指定した値は要素の個数(リストの大きさ)となります。たとえば、上記の例では2要素となります。
-この設定方法では、リストのすべての要素が未定義となります。
上記の例では以下のようになります。
|CENTER:|CENTER:|c
|インデックス|値|h
|0|undefined|
|1|undefined|

***1次元、要素定義[#list_defined]
 変数 temp02 = lvCreateVarList(2, 0)
 変数 temp03 = lvCreateVarList(2, "おりまっせ!")
-引数に整数値(自然数)と数値・テキスト・変数名(リスト型・ハッシュマップ型を除く)を指定すれば、1次元リストが生成されます。
引数の前者は要素の個数となります。たとえば、上記の例ではいずれも2要素となります。
-この設定方法では、引数の後者が全要素の初期値となります。
上記の例のうち、変数「temp02」では以下のようになります。
|CENTER:|CENTER:|c
|インデックス|値|h
|0|0|
|1|0|
変数「temp03」では以下のようになります。
|CENTER:|CENTER:|c
|インデックス|値|h
|0|"おりまっせ!"|
|1|"おりまっせ!"|

***多次元、斉次、要素均等[#list_multi_homogeneous_even]
 変数 temp04 = lvCreateVarList(2, lvCreateVarList(3, lvCreateVarList(2)))
 変数 temp05 = lvCreateVarList(2, lvCreateVarList(2, 1000))
-引数に整数値(自然数)と併せて再びリスト生成のLVN関数を指定すれば、要素均等な斉次の多次元リストが生成されます。
2つめの引数にリスト作成のLVN関数を繰り返し記述すればその回数だけ次元が増えますが、処理は重くなります。
-上記の例のうち、変数「temp04」では以下のようになります。
|CENTER:|CENTER:|CENTER:|CENTER:|c
|>|>|インデックス|値|h
|0|0|0|undefined|
|~|~|1|undefined|
|~|1|0|undefined|
|~|~|1|undefined|
|~|2|0|undefined|
|~|~|1|undefined|
|1|0|0|undefined|
|~|~|1|undefined|
|~|1|0|undefined|
|~|~|1|undefined|
|~|2|0|undefined|
|~|~|1|undefined|
変数「temp05」では以下のようになります。
|CENTER:|CENTER:|CENTER:|c
|>|インデックス|値|h
|0|0|1000|
|~|1|1000|
|1|0|1000|
|~|1|1000|

***多次元、斉次、要素不均等[#list_multi_homogeneous_uneven]
 変数 temp06 = lvCreateVarList(2)
 変数 temp06[0] = lvCreateVarList(3)
 変数 temp06[1] = lvCreateVarList(2, 0)
-リストの全要素にリスト生成のLVN関数を指定し、かつリストの大きさを統一しなければ、要素不均等な斉次の多次元リストが作成されます。
-上記の例では以下のようになります。
|CENTER:|CENTER:|CENTER:|c
|>|インデックス|値|h
|0|0|undefined|
|~|1|undefined|
|~|2|undefined|
|1|0|0|
|~|1|0|

***多次元、非斉次[#list_multi_inhomogeneous]
 変数 temp07 = lvCreateVarList(2)
 変数 temp07[0] = lvCreateVarList(2, 625)
-リストの要素にリスト生成のLVN関数を指定し、かつそのような指定をしない要素を1つでも設ければ、非斉次の多次元リストが作成されます。
-上記の例では以下のようになります。
|CENTER:|CENTER:|CENTER:|c
|>|インデックス|値|h
|0|0|625|
|~|1|625|
|>|1|undefined|



*ハッシュマップ[#hashmap]
ハッシュマップは、複数の要素を''「キー」と呼ばれる任意の文字列で扱う型''です。
変数をハッシュマップ型にするには(そのような変数を「ハッシュマップ変数」と呼びます)、LVN関数「lvCreateVarHashMap」を用います。
ただし、システム変数や、すでにリスト・ハッシュマップ以外の型になっている変数をハッシュマップ型にすることはできません。


**キーと値[#hashmap_key_and_value]
ハッシュマップ変数は任意の個数の要素を持ち、各要素の値にはキーが関連付けられます。
キーはハッシュマップにおいて変数名と同様の役割を担います。

***キー[#hashmap_key]
キーは、ハッシュマップ内の各要素に関連づいた文字列です。
-キーはハッシュマップ変数の変数名の末尾に「[]」で囲んで記述します。この大括弧は''文字列(「"」で囲んだもの)または文字列型の変数名''を囲みます。
-複数のキーを並べて記述すると、キーの個数と同じ次元の要素を指定できます。
たとえば、3次元ハッシュマップ変数において、任意の要素を指定する場合に用いるキーは最大で3個です。
-ハッシュマップ変数は通常変数と同様に代入をすることができます。
指定したキーの要素が変数値である場合には、その変数が代入されます。
指定したキーの要素がリストである場合には、「"LIST"」が代入されます。
指定したキーの要素がハッシュマップである場合には、「"HASH_MAP"」が代入されます。

***要素の追加[#hashmap_contents_add]
ハッシュマップは生成しただけでは要素を持ちません。つまり、生成時のハッシュマップの大きさは0です。
要素を追加する際には、変数名の末尾に任意のキーを付与したものを指定します。
例として、1次元ハッシュマップ変数「temp000」を定義します。
 変数 temp000 = lvCreateVarHashMap()
-新たな要素として、キー「価値」、値「"不明"」であるものを追加する場合には、以下のように記述します。
 変数 temp000["価値"] = "不明"
これによって、ハッシュマップ変数「temp000」は以下のようになります。
|CENTER:|CENTER:|c
|キー|値|h
|価値|"不明"|
-さらに、新たな要素として、キー「審美」、値「"高"」であるものを追加する場合には、以下のように記述します。
 変数 temp000["審美"] = "高"
これによって、ハッシュマップ変数「temp000」は以下のようになります。
|CENTER:|CENTER:|c
|キー|値|h
|価値|"不明"|
|審美|"高"|

***要素のキー指定と値の変更[#hashmap_contents_select]
変数値の定義や代入等で要素を指定する際には、変数名の末尾にキーを付与したものを記述します。
例として、以下のような3次元ハッシュマップ変数「temp001」を定義します。
|CENTER:|CENTER:|CENTER:|c
|>|キー|値|h
|主人公1|名前|"広葉"|
|~|年齢|15|
|主人公2|名前|"新葉"|
|~|年齢|14|
-変数値「15」を持つ要素のキーは「["主人公1"]["年齢"]」です。
この要素の値を変更する際には、変数定義の左辺に「temp001["主人公1"]["年齢"]」を記述します。
たとえば、値を「14」に変更する場合には以下のように記述します(すでに型が数値に定まっているため、数値にのみ変更可能)。
 変数 temp001["主人公1"]["年齢"] = 14
変更後のハッシュマップ変数「temp001」は以下のようになります。
|CENTER:|CENTER:|CENTER:|c
|>|キー|値|h
|主人公1|名前|"広葉"|
|~|年齢|COLOR(red):14|
|主人公2|名前|"新葉"|
|~|年齢|14|
-キー「["主人公2"]["名前"]」は値「"新葉"」を指定します。
この要素の値を代入するには、代入変数として「temp001["主人公2"]["名前"]」を記述します。
たとえば、「(temp001["主人公2"]["名前"])」は「"新葉"」となり、「{{temp001["主人公2"]["名前"]}}」は「新葉」となります。


**生成方法[#hashmap_define]

***1次元[#hashmap_1D]
 変数 temp08 = lvCreateVarHashMap()
-変数の右辺にLVN関数を用いることで、1次元のハッシュマップが作成されます。
このままでは要素を持たないので、キーと値とを設定する必要があります。

***多次元[#hashmap_multi]
 変数 temp09 = lvCreateVarHashMap()
 変数 temp09["key"] = lvCreateVarHashMap()
-ハッシュマップの任意のキーの値に再びハッシュマップ生成のLVN関数を指定すれば、多次元ハッシュマップが作成されます。



*複合配列[#composite]
リストとハッシュマップは組み合わせて多次元配列を作ることができます。
 変数 temp10 = lvCreateVarList(2, lvCreateVarHashMap())
 変数 temp10[0]["資金"] = 0
 変数 temp10[1]["執行者"] = "The Goast"
上記の例では以下のようになります。
|CENTER:|CENTER:|CENTER:|c
|インデックス|キー|値|h
|0|資金|0|
|1|執行者|"The Goast"|