lua中,多維陣列與一維陣列的相互轉換

2021-09-01 08:46:08 字數 1933 閱讀 3791

**多維陣列與一維陣列的轉換是有實際意義的,

如:1、給定乙個立方體內座標、乙個順序,問此座標在立方體內按此順序數,在第幾個;

2、給定一堆物體,按某一順序放在立方體的各座標上,問最後乙個會放在何處?

那麼,三維要如何轉為一維陣列呢?

最容易想到的方式:維護乙個遞增變數,然後遍歷,如下,

--定義乙個三維陣列和乙個空的一維陣列

local arr3 = , , },

, , },

};local arr1 = {};

--各維長度,可由上面三維陣列得到

local maxi, maxj, maxk = 2, 3, 4;

--遍歷轉換

local n = 1;

function convert()

for i=1, maxi do

for j=1, maxj do

for k=1, maxk do

arr1[n] = arr3[i][j][k];

n = n + 1;

endend

endend

這樣確實沒問題,但過於粗暴。

有沒有更優雅的方式呢?答案是有!

上述方式中,一維陣列的索引n, 是可以根據 maxi, maxj, maxk 和 i, j, k 計算出來的。

對於三維陣列,n 可表示為:

(i-1) * (maxj * maxk) + (j-1) * maxk + k
這個式子是怎麼得來的呢?

其實非常簡單,只是因為lua的陣列索引是從1開始(三維陣列的 i, j, k 和一維陣列的n,均要由1開始), 繞了個彎子。。

如果是在其他語言中,陣列索引從0開始,是什麼樣呢?

k + j * maxk + i + maxj * maxk
上式可以看作是,從一點開始組合成直線,再組合成面,再組合成立體。。。

原來如此。。。更高緯度都可自行腦補了。

所以,在lua中,三維陣列轉一維陣列的方法就變為了:

--定義乙個三維陣列和乙個空的一維陣列

local arr3 = , , },

, , },

};local arr1 = {};

--各維長度,可由上面三維陣列得到

local maxi, maxj, maxk = 2, 3, 4;

--遍歷

local function convert()

for i=1, maxi do

for j=1, maxj do

for k=1, maxk do

local n = (i-1) * (maxj * maxk) + (j-1) * maxk + k;

arr1[n] = arr3[i][j][k];

endend

endendconvert()

搞清上面的問題,想要一維轉三維也是一樣的。如下:

--定義乙個一維陣列和乙個空的三維陣列

local arr1 = ;

local arr3 = , {}, {}},

, {}, {}},

};--各維長度,可由上面三維陣列得到

local maxi, maxj, maxk = 2, 3, 4;

--遍歷轉換

local function convert()

for i=1, maxi do

for j=1, maxj do

for k=1, maxk do

local n = (i-1) * (maxj * maxk) + (j-1) * maxk + k;

arr3[i][j][k] = arr1[n];

endend

endendconvert(arr1)

一維陣列複習,二維陣列與多維陣列

輸入班級人數,輸入每個人的分數,求班級最高分,最低分,以及去掉兩個最高分並且去掉兩個最低分之後的所有人員的平均分。輸入班級人數,輸入乙個人名,輸入乙個分數。求班級最高分是多少,是誰的分數 注意姓名跟分數對應 運用兩個一維陣列 運用乙個一維陣列 乙個元素是乙個點,一維陣列是一條線,二維陣列是乙個面,三...

多維陣列變一維陣列

判斷是否是陣列 let isarr arr arr instanceof array 判斷是否一維陣列 let istdim arr arr.reduce o1,o2 o1 isarr o2 true 多維陣列變一維陣列function name return a console.log name ...

一維陣列變多維陣列

1.雙層filter過濾 第一層 item 定義為father newarr接收 第一層過濾出最頂層陣列 判斷 brancharr的長度 存在father.children brancharr 否則為空 return father.pid 0 第二層 item 定義為child brancharr接...