亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

LUA 關于取出兩個table中不同元素的算法。

LUA 關于取出兩個table中不同元素的算法。

富國滬深 2019-03-29 19:18:00
首先我建立兩個table定義一個臨時table,把T_letter_tbl賦值給臨時table,然后用一個雙循環遍歷兩個table,找出兩個table相同的一項,清空我想用Interim_tbl[j]=nil清空這些元素,循環只能執行一次,如果我用table.remove來做,則出現這種情況并且求這種操作的其他算法  
查看完整描述

3 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

【我理解下你的意思你是要把 T_letter_tbl 中所有元素的 letter標簽和  和 hope_letter_tbl 中的元素比較,如果 發現重復 的 則刪除 T_letter_tbl 中的 重復標簽嗎?【一般做法】用 lua 做這種很容易,但是要注意方法,不是比較,那樣遍歷比較 效率太低。先把 需要比較的 table 的元素作為 索引 建立一個 hash直接取元素 進行 標簽判斷,

下面是一個演示: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"};

};

--- 根據 tbl_letter_HOPE 中的元素 去除 tbl_letter_T 中的元素

-- 

local function main ()

    local tbl_erase = {}

    for key, ele in pairs(tbl_letter_HOPE) do

       -- 不考慮 元素權重則 改為  = 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

             

            -- 還是 一個標簽 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

可以先 復制原 tbl_letter_T

注意:

不要用 淺復制 你之前 那個代碼 可能 就是 希望做一個 tbl_letter_T 的副本

但是 使用 淺復制 相當于僅復制了指向table的句柄。

1

tbl_Interim = tbl_letter_T   -- 2個變量指向同一個 table表

要用

1

2

3

for key, ele in pairs(tbl_letter_T) do

 tbl_Interim [key] = ele

end

 


查看完整回答
反對 回復 2019-03-31
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

不要用remove操作表
因為remove操作后表的長度改變了 后面的元素也會往前移
而你循環的次數則是在一開始就定好了 這就會導致最后幾次訪問出錯

打個比方
兩個table 各15個元素 只有第7個那一對是相同的
你for到第7次的時候remove了第7個 而原來的第8個 變成了7 9變成了8
當你for到15的時候 已經是個nil了

查看完整回答
反對 回復 2019-03-31
  • 3 回答
  • 0 關注
  • 2582 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號