lua 刪除陣列元素的正確姿勢

2021-10-01 13:14:28 字數 3531 閱讀 2276

lua中的陣列刪除元素,如果刪除姿勢不規範的話,往往會遇到意想不到的問題。那麼正確的姿勢是怎樣的呢?

方法一:

例子:

local list =

print

("_______________lastlist_________________"

)for k,v in

pairs

(list)

doprint

(k,v)

endfor k,v in

pairs

(list)

doif v ==

"a" or v ==

"c" then

v =nil

endendprint

("_______________laterlist_________________"

)for k,v in

pairs

(list)

doprint

(k,v)

end

結果:

_______________lastlist_________________

1 a2 b

3 c4 d

5 e6 f

7 g8 h

9 i_______________laterlist_________________

1 a2 b

3 c4 d

5 e6 f

7 g8 h

9 i[finished in

0.1s]

//因為 v 是乙個額外的變數,對v的操作無法反饋到陣列內部,但是如果v是table,

//table內部儲存了引用,對v內部的修改可以反饋過去

方法二:

例子:

local list =

print

("_______________lastlist_________________"

)for k,v in

pairs

(list)

doprint

(k,v)

endfor k,v in

pairs

(list)

doif v ==

"a" or v ==

"c" then

list[k]

= nil

endend

結果:
_______________lastlist_________________

1 a2 b

3 c4 d

5 e6 f

7 g8 h

9 i_______________laterlist_________________

2 b4 d

5 e6 f

7 g8 h

9 i[finished in

0.1s]

//賦值為nil,可用於多處場景下的刪除也可以直接使用key值

方法三:

例子:

//使用table.remove(table,i)。table.remove會使得陣列的位移產生,

//從而跳過或者報錯。

local list =

print

("_______________lastlist_________________"

)for k,v in

pairs

(list)

doprint

(k,v)

endfor k,v in

pairs

(list)

doif v ==

"a" or v ==

"c" then

table.

remove

(list,k)

endend

結果:
_______________lastlist_________________

1 a2 c

3 c4 a

5 e6 f

7 g8 h

9 i_______________laterlist_________________

1 c //??????????

2 a //??????????

3 e4 f

5 g6 h

7 i[finished in

0.1s]

remove的正確使用方法:使用乙個新的list儲存k值,在新的遍歷過程中移除

例子:

local list =

local removelist =

print

("_______________lastlist_________________"

)for k,v in

pairs

(list)

doprint

(k,v)

endfor k,v in

pairs

(list)

doif

(v ==

"a")

or(v ==

"c") then

table.

insert

(removelist,k)

end

endprint

("_______________removelist_________________"

)for k,v in

pairs

(removelist)

doprint

(k,v)

endfor _,v in

pairs

(removelist)

do table.

remove

(list,v)

endprint

("_______________laterlist_________________"

)for k,v in

pairs

(list)

doprint

(k,v)

end

結果:

_______________lastlist_________________

1 a2 c

3 c4 a

5 e6 f

7 g8 h

9 i_______________removelist_________________11

2233

44_______________laterlist_________________

1 c2 a

3 f4 h

5 i[finished in

0.1s]

怎麼說呢,table.remove使用起來很麻煩,而且使用有侷限性(對於不是用順序表儲存的table無法使用),所以推薦使用nil賦值進行清除,但是這樣做,並沒有真正的刪除這個值,只是迴圈時不會顯示出來,實際上table的長度並沒有變化。

刪除陣列中多個不連續的陣列元素的正確姿勢

var arr a a b c d a a e g a f arr.foreach function key,index a b c d a e g f 只要相鄰的 a 元素,都沒被刪除,splice不但可以刪除原素本身,還同時可以減少陣列長度 就是抹去一切痕跡 這樣導致後續的陣列元素會代替已經刪除...

Java刪除集合中元素的正確姿勢

1 使用foreach的話,在刪除完元素之後,接著遍歷就會拋異常。如下圖所示 因為foreach實際的實現原理是迭代器的方式去遍歷,會去呼叫itr物件的hasnext 和next 方法。在該類的next和remove方法中,都會去呼叫checkforcomodification 方法,該方法內部就做...

js刪除陣列元素

方法 array.remove dx 功能 刪除陣列元素.引數 第乙個引數是說明第二個引數的型別,index 表示第二個引數是元素下標,element 表示第二個引數是要刪除的元素 返回 在原陣列上修改陣列 刪除陣列元素,第乙個引數是說明第二個引數的型別,index 表示第二個引數是元素下標,ele...