3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
【我理解下你的意思你是要把 T_letter_tbl 中所有元素的 letter標(biāo)簽和 和 hope_letter_tbl 中的元素比較,如果 發(fā)現(xiàn)重復(fù) 的 則刪除 T_letter_tbl 中的 重復(fù)標(biāo)簽嗎?【一般做法】用 lua 做這種很容易,但是要注意方法,不是比較,那樣遍歷比較 效率太低。先把 需要比較的 table 的元素作為 索引 建立一個(gè) hash直接取元素 進(jìn)行 標(biāo)簽判斷,
下面是一個(gè)演示:table.print 自定義的輸出,可以刪去,自己選擇輸出方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
function table.print ( tbl, name ) name = name or "table" local prompt = ' ' local i = 1 local printed = {} local function tostring2 ( var ) if (type( var) == "string" ) then return '"' ..var ..'"' end
return tostring(var ) end local function itor ( t , i ) printed[ tostring( t)] = true; for key , ele in pairs (t ) do if not (type( ele) == "table" ) then print( string .format('%s[%s] = %s;' , string.rep( prompt, i ), tostring2 ( key ),tostring2 (ele )) ) elseif printed [tostring( ele)] then print( string .format('%s[%s] = %s;' , string.rep( prompt, i ), tostring2 ( key ),tostring2 (ele )) ) else print( string .format('%s[%s] = {' , string.rep( prompt, i ), tostring2 ( key )) ) i = i + 1 itor( ele, i) i = i - 1 print( string .format('%s};' , string.rep( prompt, i )) ) end end end
print( string.format( "%s = {" , name ) ) itor( tbl, i) print("};" ) end ----------------------------------------------------- tbl_letter_HOPE = { [1] = "bbbbbb"; [2] = "ffffff"; [3] = "cccccc"; [4] = "xxxxxx"; [5] = "eeeeee"; }; tbl_letter_T = { [1] = {["letter"] = "Y"}; [2] = {["letter"] = "M"}; [3] = {["letter"] = "P"}; [4] = {["letter"] = "K"}; [5] = {["letter"] = "bbbbbb"}; [6] = {["letter"] = "R"}; [7] = {["letter"] = "Q"}; [8] = {["letter"] = "xxxxxx"}; [9] = {["letter"] = "L"}; [10] = {["letter"] = "D"}; [11] = {["letter"] = "B"}; [12] = {["letter"] = "ffffff"}; [13] = {["letter"] = "Z"}; [14] = {["letter"] = "T"}; [15] = {["letter"] = "["}; [16] = {["letter"] = "cccccc"}; [17] = {["letter"] = "E"}; [18] = {["letter"] = "C"}; [19] = {["letter"] = "W"}; [20] = {["letter"] = "I"}; [21] = {["letter"] = "F"}; [22] = {["letter"] = "eeeeee"}; [23] = {["letter"] = "O"}; [24] = {["letter"] = "X"}; [25] = {["letter"] = "U"}; [26] = {["letter"] = "S"}; }; --- 根據(jù) tbl_letter_HOPE 中的元素 去除 tbl_letter_T 中的元素 -- local function main () local tbl_erase = {} for key, ele in pairs(tbl_letter_HOPE) do -- 不考慮 元素權(quán)重則 改為 = true tbl_erase[tostring(ele)] = (tbl_erase[tostring(ele)] or 0) + 1 end
for key, ele in pairs(tbl_letter_T) do if tbl_erase[ele.letter] then -- 移除 整行 [12] = {["letter"] = "ffffff"}; tbl_letter_T[key] = nil
-- 還是 一個(gè)標(biāo)簽 letter --tbl_letter_T[key].letter = nil end end table.print(tbl_letter_T) end startTime = os.time() main() print( string.format(">> This function cost: %s ms", tostring(os.time()-startTime) ) ) |
【附】
如果只想 獲得去除給定元素后的 table
可以先 復(fù)制原 tbl_letter_T
注意:
不要用 淺復(fù)制 你之前 那個(gè)代碼 可能 就是 希望做一個(gè) tbl_letter_T 的副本
但是 使用 淺復(fù)制 相當(dāng)于僅復(fù)制了指向table的句柄。
1 | tbl_Interim = tbl_letter_T -- 2個(gè)變量指向同一個(gè) table表 |
要用
1 2 3 | for key, ele in pairs(tbl_letter_T) do tbl_Interim [key] = ele end |

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
不要用remove操作表
因?yàn)閞emove操作后表的長度改變了 后面的元素也會往前移
而你循環(huán)的次數(shù)則是在一開始就定好了 這就會導(dǎo)致最后幾次訪問出錯(cuò)
打個(gè)比方
兩個(gè)table 各15個(gè)元素 只有第7個(gè)那一對是相同的
你for到第7次的時(shí)候remove了第7個(gè) 而原來的第8個(gè) 變成了7 9變成了8
當(dāng)你for到15的時(shí)候 已經(jīng)是個(gè)nil了
- 3 回答
- 0 關(guān)注
- 2574 瀏覽
添加回答
舉報(bào)