**多維陣列與一維陣列的轉換是有實際意義的,
如: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接...