Elemente während des Iterierens sicher aus einer Array-Tabelle entfernen

Diese Frage ist ähnlich Wie kann ich sicher Durchlaufen eine lua-Tabelle, während die Tasten werden entfernt aber deutlich anders.

Zusammenfassung

Gegeben ein Lua-array (Tabelle mit Schlüssel und sequentiell Ganzzahlen ab 1), was ist der beste Weg, um eine Iteration durch das array und löschen Sie die Einträge, wie Sie gesehen werden?

Real World " - Beispiel

Ich habe ein array mit Zeitstempel versehene Einträge, die in ein Lua-array-Tabelle. Einträge werden immer an das Ende des Arrays (mit table.insert).

local timestampedEvents = {}
function addEvent( data )
  table.insert( timestampedEvents, {getCurrentTime(),data} )
end

Ich muss gelegentlich laufen durch diese Tabelle (in der Reihenfolge) und Prozess-und-löschen bestimmter Einträge:

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 ist der code oben erwähnten Ansatz bricht die iteration, überspringt einige Einträge. Gibt es eine bessere (weniger eingeben, aber immer noch sichere) Weg, dies zu tun, als manuell gehen die Indizes:

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

InformationsquelleAutor der Frage Phrogz | 2012-09-12

Schreibe einen Kommentar