Lua表的構造及遍歷


    關於lua中的table,主要的困惑來自於table既可以當array用又可以當record用,有時候就會混淆不清。

    lua中的table貌似是用map來實現的,array是語法糖,一種特例。下面是lua中構造table的標准方法:

local numbers = {[1]=1, [2]=2, ["x"]=3, [type]=4}
numbers[1] == 1
numbers[2] == 2
numbers.x == 3
numbers[type] == 4

    構造table的標准方法是建立[key]=value的鍵值對,訪問的時候通過table[key]的形式來獲取到value。

    numbers.x 等價於 numbers[“x”]

   

    把table當array用:不用寫key了,訪問的時候用table[index]的形式來獲取到value。注意array不連續時遍歷可能出現問題

local numbers = {1, 2, 3}

numbers[5] = 5

for i=1,#numbers do
    print(numbers[i])     -- 1,2,3
end

    沒有遍歷到numbers[5],這是因為#numbers的值只是3,#這個操作符很奇怪,當array不連續的時候它並不能獲取到正確的長度,獲取到的是從1開始的連續數組的長度。所以一旦array發生了刪改,就不能依賴#來獲取到長度了。不過從另外一個方面講,既然數組已經是不連續的了,那么獲取table的長度也就沒什么意義了。

    如果在數組不連續的狀況下仍然要對數組進行順序遍歷操作,可以使用table.maxn函數,這將得到最大的整數key。

    這跟array本身的性質是一致的,想想在C++里面,如果要刪除array里的一個元素,還不是得進行整塊的數據移動。我想如果要把table當array用的話,就要盡量避免不要出現不連續的情況。

 

    把table當record用:numbers.x 等價於 numbers[“x”],實際上numbers.x 這種就是字符串作為key的一種語法糖。

 

    另外table可以record和array混合着用:

local numbers = {1, 2, 3, x="hello", 4, y="ha?"}

for key,value in pairs(numbers) do
    print("key: " .. tostring(key) .. ", value: " .. tostring(value))
end

-- key: 1, value: 1
-- key: 2, value: 2
-- key: 3, value: 3
-- key: 4, value: 4
-- key: y, value: ha?
-- key: x, value: hello

    這個其實也倒沒什么,就是看起來畸形了點,實際中還是少用為妙。

 

 

    關於table的遍歷簡單說一下看法:

    如果把table當array用的並且是連續的話,使用for i=1,#numbers do的方法簡潔不少。如果array不連續但是硬要遍歷,那就用for i=1, table.maxn(numbers) do

    如果把table當record用的話,那就用for key,value in pairs(numbers) do。這種方法也可以遍歷array,但是貌似不是順序遍歷。

    至於還有一種方法for key,value in ipairs(numbers) do,貌似效果跟#numbers是類似的,所以就沒必要用它了,不方便。

 

 

 

 

    PS:再多說一下對於table進行操作的幾個函數:

    table.getn() :效果和#一樣

    table.foreach(key, value):效果和for key,value in pairs(numbers) do 一樣

    table.foreachi(key, value): 效果和for key,value in ipairs(numbers) do 一樣

    table.insert(table, pos, value): 在array中指定位置插入一個元素,類似於STL中vector的insert,把插入元素時數組的移動封裝起來了,挺好用的

    table.remove : 不說了,和insert對應

    table.concat(table, sep,  start, end) : 返回一個字符串,其中包含了以sep作為分隔符的從start到end的元素

   

    具體的情況可以參考一篇文章:http://rangercyh.blog.51cto.com/1444712/1032925


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM