Lua 配列

配列とは、同じデータ型の要素が一定の順序で並べられた集合であり、1次元配列や多次元配列にすることができます。

Luaでは、配列は特定のデータ型ではなく、一連の値を格納するためのデータ構造です。

実際には、Luaには専用の配列型はなく、"table"というデータ構造を使用して配列の機能を実装しています。

Luaの配列のインデックスキーは整数で表すことができ、配列のサイズは固定ではありません。

Luaではインデックス値は1が開始値ですが、0から始めるように指定することもできます。


1次元配列

1次元配列は最も単純な配列で、その論理構造は線形リストです。

インデックスを使用して配列要素にアクセスします:

例

-- 配列を作成
local myArray = {10, 20, 30, 40, 50}

-- 配列要素にアクセス
print(myArray[1])  -- 10 を出力
print(myArray[3])  -- 30 を出力

上記のコードを実行した出力結果は次のとおりです:

10
30

配列の長さ(配列内の要素数)を計算するには、#演算子を使用できます:

例

local myArray = {10, 20, 30, 40, 50}

-- 配列の長さを計算
local length = #myArray

print(length) -- 5 を出力

上記のコードを実行した出力結果は次のとおりです:

5

1次元配列はforループで配列内の要素を出力できます。次の例のとおりです:

例

-- 配列を作成
local myArray = {10, 20, 30, 40, 50}

-- ループで配列を走査
for i = 1, #myArray do
    print(myArray[i])
end

上記のコードを実行した出力結果は次のとおりです:

10
20
30
40
50

Luaのインデックスはデフォルトで1から始まります:

例

array = {"Lua", "Tutorial"}

for i= 0, 2 do
   print(array[i])
end

上記のコードを実行した出力結果は次のとおりです:

nil
Lua
Tutorial

ご覧のとおり、整数インデックスを使用して配列要素にアクセスできます。指定したインデックスに値がない場合はnil。

さらに、負の数を配列のインデックス値として使用することもできます:

例

array = {}

for i= -2, 2 do
   array[i] = i *2
end

for i = -2,2 do
   print(array[i])
end

上記のコードを実行した出力結果は次のとおりです:

-4
-2
0
2
4

配列内の要素を変更することもできます:

例

-- 配列を作成
local myArray = {10, 20, 30, 40, 50}

-- 配列要素を変更
myArray[2] = 25

-- ループで配列を走査
for i = 1, #myArray do
    print(myArray[i])
end

上記のコードを実行した出力結果は次のとおりです:

10
25
30
40
50

配列に要素を追加することもできます:

例

-- 配列を作成
local myArray = {10, 20, 30, 40, 50}

-- 配列の末尾に新しい要素を追加
myArray[#myArray + 1] = 60


-- ループで配列を走査
for i = 1, #myArray do
    print(myArray[i])
end

上記のコードを実行した出力結果は次のとおりです:

10
20
30
40
50
60

配列内の要素を削除することもできます:

例

-- 配列を作成
local myArray = {10, 20, 30, 40, 50}

-- 3番目の要素を削除
table.remove(myArray, 3)

-- ループで配列を走査
for i = 1, #myArray do
    print(myArray[i])
end

上記のコードを実行した出力結果は次のとおりです:

10
20
40
50

多次元配列

多次元配列とは、配列内に配列が含まれるもの、または1次元配列のインデックスキーが配列に対応するものです。

以下は3行3列の多次元配列です:

例

-- 配列を初期化
array = {}
for i=1,3 do
   array[i] = {}
      for j=1,3 do
         array[i][j] = i*j
      end
end

-- 配列にアクセス
for i=1,3 do
   for j=1,3 do
      print(array[i][j])
   end
end

上記のコードを実行した出力結果は次のとおりです:

1
2
3
2
4
6
3
6
9

異なるインデックスキーを持つ3行3列の多次元配列:

例

-- 配列を初期化
array = {}
maxRows = 3
maxColumns = 3
for row=1,maxRows do
   for col=1,maxColumns do
      array[row*maxColumns +col] = row*col
   end
end

-- 配列にアクセス
for row=1,maxRows do
   for col=1,maxColumns do
      print(array[row*maxColumns +col])
   end
end

上記のコードを実行した出力結果は次のとおりです:

1
2
3
2
4
6
3
6
9

ご覧のとおり、上記の例では、配列に指定したインデックス値を設定しているため、nil値の発生を回避でき、メモリ容量の節約に役立ちます。

その他の拡張