2015-08-09 145 views
2

以下代碼將表格格式化爲可打印的字符串,但我覺得這樣做可以更容易。使用string.gsub格式化Lua中的表格

function printFormat(table) 
    local str = "" 

    for key, value in pairs(table) do 
     if value == 1 then 
      str = str .. string.gsub(value, 1, "A, ") -- Replaces 1 with A 
     elseif value == 2 then 
      str = str .. string.gsub(value, 2, "B, ") -- Replaces 2 with B 
     elseif value == 3 then 
      str = str .. string.gsub(value, 3, "C, ") -- Replaces 3 with C 
     elseif value == 4 then 
      str = str .. string.gsub(value, 4, "D, ") -- Replaces 4 with D 
     end 
    end 
    str = string.sub(str, 1, #str - 2) -- Removes useless chars at the end (last comma and last whitespace) 
    str = "<font color=\"#FFFFFF\">" .. str .. "</font>" -- colors the string 

    print(str) 
end 

local myTable = {1,4,3,2,3,2,1,3,4,2,2,...} 
printFormat(myTable) 

有沒有辦法使用oneliner而不是循環遍歷每個索引並進行更改?

還是讓代碼更緊湊?

+0

'STR = table.concat(myTable的, ' '):GSUB(' %d +',{[ '1'] ='A',['2'] ='B',['3'] ='C',['4'] ='D'})' –

回答

0

您可以使用一個輔助表來代替多個if聲明:

local chars = {"A", "B", "C", "D"} 
for _, v in ipairs(t) do 
    str = str .. chars[v] .. ", " 
end 

或者,如果有超過14,試試這個:

for _, v in ipairs(t) do 
    str = str .. string.char(string.byte('A') + v) .. ", " 
end 
+0

我選擇了這個答案,因爲它是因爲for循環更靈活,所以即使是hjpotter也更加緊湊。謝謝! –

0
  1. 使用table.concat
  2. string.gsub可以使用替換表執行替換。
  3. 請勿使用table之類的名稱作爲自己的變量。

因此:

function printFormat(tInput) 
    local sReturn = table.concat(tInput, ', ') 
    sReturn = sReturn:gsub('%d', {['1'] = 'A', ...}) -- update table accordingly 
    return '<font color="#FFFFFF">' .. str .. "</font>" 
end 

,並且對於一個襯裏:

return '<font color="#FFFFFF">' .. (table.concat(tInput, ', ')):gsub('%d', {['1'] = 'A', ...} ) 
+0

我真的很喜歡這段代碼。 Thx發佈它!關於如何爲代碼添加'A','B','C','D'智能計數器的任何想法? (例如,A發生多少次,B多少次等等)。 –