Entfernen Sie während der Iteration sicher Elemente aus einer Array-Tabelle
Diese Frage ähneltWie kann ich eine Lua-Tabelle sicher durchlaufen, während Schlüssel entfernt werden? aber deutlich anders.
ZusammenfassungGegeben ein Lua - Array (Tabelle mit Schlüsseln, die sequentielle ganze Zahlen sind, beginnend mit1
), was ist der beste Weg, um durch dieses Array zu iterierenund löschen Sie einige der Einträge so, wie sie angezeigt werden?
Ich habe ein Array von zeitgestempelten Einträgen in einer Lua-Array-Tabelle. Einträge werden immer am Ende des Arrays eingefügt (mittable.insert
).
local timestampedEvents = {}
function addEvent( data )
table.insert( timestampedEvents, {getCurrentTime(),data} )
end
Ich muss diese Tabelle gelegentlich (in der angegebenen Reihenfolge) durchgehen und bestimmte Einträge verarbeiten und entfernen:
function processEventsBefore( timestamp )
for i,stamp in ipairs( timestampedEvents ) do
if stamp[1] <= timestamp then
processEventData( stamp[2] )
table.remove( timestampedEvents, i )
end
end
end
Leider unterbricht der obige Code die Iteration und überspringt einige Einträge. Gibt es eine bessere (weniger tippende, aber dennoch sichere) Möglichkeit, dies zu tun, als die Indizes manuell zu durchlaufen:
function processEventsBefore( timestamp )
local i = 1
while i <= #timestampedEvents do -- warning: do not cache the table length
local stamp = timestampedEvents[i]
if stamp[1] <= timestamp then
processEventData( stamp[2] )
table.remove( timestampedEvents, i )
else
i = i + 1
end
end
end