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...