Bezpiecznie usuwaj elementy z tabeli tablic podczas iteracji

To pytanie jest podobne do tegoJak mogę bezpiecznie iterować stół lua podczas usuwania kluczy ale wyraźnie inny.

streszczenie

Biorąc pod uwagę tablicę Lua (tabela z kluczami, które są kolejnymi liczbami całkowitymi zaczynającymi się od1), jaki jest najlepszy sposób iteracji tej tablicyi usuń niektóre wpisy, tak jak są widoczne?

Przykład świata rzeczywistego

Mam tablicę znaczników czasu w tabeli tablicy Lua. Wpisy są zawsze dodawane na końcu tablicy (przy użyciutable.insert).

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

Od czasu do czasu muszę przeglądać tę tabelę (w kolejności) i przetwarzać i usuwać niektóre wpisy:

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

Niestety powyższy kod łamie iterację, pomijając niektóre wpisy. Czy istnieje lepszy (mniejszy typ, ale nadal bezpieczny) sposób, aby to zrobić niż ręczne przechodzenie indeksów:

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

questionAnswers(9)

yourAnswerToTheQuestion