Lua Table pairs輸出順序問題 (版本差別 解決數字索引間斷併兼容字符串索引)

問題標籤:測試

  Lua Table 迭代器;Lua Table 輸出順序; Lua Table 順序輸出;Lua Table 數字索引 字符串索引;Lua Table pairs;lua

問題背景:spa

  使用pairs輸出table時,其輸出順序與一般認知不相符.code

  例如使用pairs輸出以下tableblog

T = {
    [1] = "1",
    [2] = "1",
    [3] = "1",
    [4] = "1",
    [5] = "1",
    
    [10] = "1",
    [20] = "1",
    [30] = "1",
    [40] = "1",
    [50] = "1",
    
    [11] = "1",
    [12] = "1",
    [13] = "1",
    q = "1",
    [14] = "1",
    w = "1",
    [15] = "1",
    e = "1",
    r = "1",
    t = "1",
    y = "1",
}

for k,v in pairs(T) do
    print(k)
end

咱們一般認爲:輸出結果會是先順序輸出12345,再亂序輸出其它索引

可是恰巧 在lua 5.1.5 都是亂序字符串

 

 

經測試在lua 5.1.5,若是想與一般認爲相符,那麼就不能顯示指定索引值,只能隱式指定索引值,就是把上述table改爲這樣:string

 

T = {
    "1",
    "1",
    "1",
    "1",
    "1",
    
    [10] = "1",
    [20] = "1",
    [30] = "1",
    [40] = "1",
    [50] = "1",
    
    [11] = "1",
    [12] = "1",
    [13] = "1",
    q = "1",
    [14] = "1",
    w = "1",
    [15] = "1",
    e = "1",
    r = "1",
    t = "1",
    y = "1",
}

 

可是這種解決辦法,顯然讓人沒法接受,讓人窒息.因此今天研究了一下解決辦法io

 

目標:table

  使用迭代器輸出Table時,首先順序輸出數字索引(容許數字索引間斷),最後輸出字符串索引

問題解決:

  靈感來源於<Programming In Lua>中的代碼:

 

function pairsByKeys(t)
    local a = {}

    for n in pairs(t) do
        a[#a + 1] = n
    end

    table.sort(a)

    local i = 0
        
    return function()
        i = i + 1
        return a[i], t[a[i]]
    end
end

for key, value in pairsByKeys(表) do      
     
end 

 

  可是這個還差點意思,當table中包含字符串索引時,會報錯.咱們指望能和pairs同樣兼容字符串索引.咱們強化一下,以下:

function spairs(t)
    local num_key_table = {}
    local string_key_table = {}
    
    for k,v in pairs(t) do
        if type(k) == "number" then
            num_key_table[#num_key_table + 1] = k
        else
            string_key_table[k] = v
        end
    end
    
    table.sort(num_key_table)
    
    local i = 0
    
    return function()
        if  i < #num_key_table then
            i = i + 1
            return num_key_table[i], t[num_key_table[i]]
        else
            for k,v in pairs(string_key_table) do
                string_key_table[k] = nil
                return k,v
            end
        end
    end
end

for k,v in spairs(T) do
    print(k)
end

對比:

還有改進的地方,歡迎指導

相關文章
相關標籤/搜索