迭代时安全地从数组表中删除项目

2023-12-12

这个问题类似于当键被删除时如何安全地迭代 lua 表但明显不同。

Summary

给定一个 Lua 数组(表中的键是从1),迭代这个数组的最佳方法是什么并删除一些看到的条目?

现实世界的例子

我在 Lua 数组表中有一个带时间戳的条目数组。条目始终添加到数组的末尾(使用table.insert).

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

我偶尔需要(按顺序)运行该表并处理并删除某些条目:

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

不幸的是,上面的代码方法破坏了迭代,跳过了一些条目。有没有比手动遍历索引更好的(更少打字,但仍然安全)的方法来做到这一点:

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

迭代数组并在继续迭代的同时从中间删除随机项的一般情况

如果您从前到后迭代,当您删除元素 N 时,迭代中的下一个元素 (N+1) 将向下移动到该位置。如果您增加迭代变量(如 ipairs 所做的那样),您将跳过该元素。我们有两种方法可以解决这个问题。

使用此示例数据:

    input = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' }
    remove = { f=true, g=true, j=true, n=true, o=true, p=true }

我们可以删除input迭代期间的元素:

  1. 从后向前迭代。

    for i=#input,1,-1 do
        if remove[input[i]] then
            table.remove(input, i)
        end
    end
    
  2. 手动控制循环变量,这样我们就可以在删除元素时跳过递增它:

    local i=1
    while i <= #input do
        if remove[input[i]] then
            table.remove(input, i)
        else
            i = i + 1
        end
    end
    

对于非数组表,您可以使用迭代next or pairs(其实施方式是next) 并将您想要删除的项目设置为nil.

注意table.remove每次调用时都会移动所有后续元素,因此 N 次删除的性能呈指数级增长。如果您要删除很多元素,您应该像 LHF 或 Mitch 的答案一样自行移动这些项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代时安全地从数组表中删除项目 的相关文章

  • Lua-迭代嵌套表

    我已经学习 Lua 几个星期了 这一次又一次成为我的症结所在 我尝试阅读有关该主题的帖子和书籍 我使用 Lua 查询软件监控系统 Nimsoft 我的数据以表格形式返回给我 我不会发布整个输出 但这里有一个我认为可以描述结构的片段 表参考是
  • 什么时候适合使用Lua这样的嵌入式脚本语言

    我玩 魔兽世界 大约有两年了 我对用来编写插件的 Lua 很好奇 由于到目前为止我读到的有关 Lua 的内容都是 快 轻 和 这太棒了 所以我想知道如何以及何时使用它 您需要在系统中嵌入像 Lua 这样的脚本语言的典型情况是什么 当您需要最
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • 如何在Conky中实现一个基本的Lua功能?

    我正在尝试向我的 Conky 添加一个函数 该函数打印字符串的长度以用于调试目的 代码位于名为的文件内test lua 非常简单 function test word return string len word end 我这样加载它 在我
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 安装Lua套接字库

    要么我太累了 要么我瞎了 我想学习 Lua 网络 因此我必须安装socketlib 所以我可以轻松地要求它 但我不知道我应该 要求 哪些文件 例子说 local socket require socket 但正如我所说 如果我使用 我不知道
  • 比较 Lua 中的日期

    我有一个带有日期表的变量 如下所示 table day number 15 year number 2015 month number 2 如何获取当前日期与上述日期之间的天数 非常感谢 您可以使用os time 将表转换为秒并获取当前时间
  • 如何在我的 Lua 脚本中添加“睡眠”或“等待”?

    我正在尝试通过更改一天中的时间来为游戏制作一个简单的脚本 但我想快速完成 这就是我要说的 function disco hour minute setTime 1 0 SLEEP setTime 2 0 SLEEP setTime 3 0
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • LuaJ 导入 Lua 方法

    我正在使用 LuaJ 并且我有一个 lua文件充满了一堆函数 如何通过 LuaJ 导入这些函数以在 Java 中使用 一种选择是将文件编译为 Java 代码并导入它 另一种方法是使用可嵌入解释器直接从 Java 代码中调用 Lua 文件 E
  • 在 Awesome-wm 中为特定应用程序设置窗口布局

    如何配置很棒 以便它可以启动两个窗口对齐的新应用程序 如下所示 xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx 其中 x 是 pidgin 中的对话窗口 是好友列表窗口 一般来说 我想指定右窗口的宽度
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • Lua表在内存中是如何处理的?

    lua如何处理表的增长 是否相当于ArrayList在Java中 IE 需要连续的内存空间 并且当它变得大于已经分配的空间时 内部数组被复制到另一个内存空间 有什么聪明的方法来引导吗 我的问题是 表是如何存储在内存中的 我不是问如何在 Lu
  • Lua 中的贪婪/非贪婪模式匹配和可选后缀

    在 Lua 中 我正在尝试模式匹配和捕获 384 Critical Strike Reforged from Parry Chance as 384 Critical Strike 后缀在哪里 Reforged from s 是可选的 长版
  • 构建自动化和 MySQL Workbench 脚本:正向工程师 SQL CREATE SCRIPT

    我目前正在研究自动化软件构建过程 其中包括 MySQL Workbench 中定义的数据库架构 使用 Workbench 的脚本编写功能 我想打开一个 Workbench 文档并将其架构导出为 SQL CREATE 脚本 我想知道是否有一个
  • 如何在 Lua-C API 5.2 中创建类对象?

    我正在使用 Lua 封装 C 函数 使用 Lua 5 2 的 Lua C API include
  • 使用 luasocket smtp 和 ssl 发送电子邮件

    我一直在尝试使用帖子中描述的代码发送电子邮件 lua使用gmail账户发送邮件 https stackoverflow com questions 11070623 lua send mail with gmail account 代码由米
  • 5.2 中的沙箱嵌入式 Lua / 从 lua.file 设置函数环境

    假设我至少有两个 lua 脚本文件 测试1 lua 测试2 lua 两者都定义了一个 init 函数和其他具有相似名称的函数 我如何使用 Lua 5 2 将使用 c c 的每个脚本文件加载到单独的环境中 以便相同的函数名称不会冲突 我找到了
  • 如何找到我使用的 Lua 版本?

    我使用 Lua Glider 2 Corona SDK 最新版本开发应用程序 我怎样才能找到它使用哪个版本的Lua 谢谢 您可以使用全局变量 VERSION http www lua org manual 5 2 manual html p
  • lua模块未加载库

    背景信息 我是 lua 的新手 我想了解模块是如何工作的 但我试图将预先存在的模块加载到新脚本中并从命令行运行该脚本 Code 我有一个名为 main lua 模块的文件 看起来像这样 module package seeall Load

随机推荐

  • JAXB 错误:有多个映射。由于两个对象工厂具有相同的 Bean

    我有两个 Maven JAXB 项目 A 主要 Maven JAXB 存根 XSD 项目 其中包含 BASKET xsd B Maven JAXB 存根想要将 BASKET xsd 包装在自己的对象中的用户项目 这会产生两个对象工厂 不同的
  • 如何在 GitHub 上合并远程更改?

    第一次尝试 Github 推送时出现以下错误 rejected master gt master non fast forward error failed to push some refs to email protected me m
  • masm32 调用 stdout 没有输出

    我正在使用 masm32 在 Windows 7 上编译和链接 它与下面的代码一起工作得很好 然而 调用 stdOut 并不是简单地在命令提示符上打印任何内容 我究竟做错了什么 386 model flat stdcall option c
  • 如何制作一个互动节目?

    我正在学习 Ocaml 我需要创建一个可以通过以下方式与用户交互的程序 Program Welcome User command1 arg1 arg2 program The answer is User command2 arg prog
  • 在这种情况下如何在 Racket 上订购我的累积变量?

    出于教育原因 我使用 Racket 进行编码 我收到了一项任务 其中我应该创建一个函数 在没有过滤器的情况下 它将接收一个列表作为输入 并仅返回另一个列表 其中包含第一个列表的偶数 我提出了迭代过程的递归定义 define add even
  • 使用向量的 r 子集数组

    我觉得这个问题应该已经有了答案 但我没有找到 我有一个数组 我想使用向量对其进行子集化 我知道如何以困难的方式做到这一点 但我确信一定有一种简单的方法 有任何想法吗 这是我的例子 dat lt data frame a rep letter
  • Spring Boot + Hibernate + Postgres - 不创建表

    我正在尝试基于实体生成架构表 应用程序正确启动 生成 SQL 但没有结果 没有创建任何表 怎么了 我在没有 Spring Boot 的情况下在普通 Spring MVC Hibernate JPA 中使用了相同的设置 并且一切正常 这是我的
  • 为什么Python的嵌套函数不称为闭包?

    我在 Python 中见过并使用过嵌套函数 它们与闭包的定义相匹配 那么为什么它们被称为 嵌套函数 而不是 闭包 呢 嵌套函数不是闭包 因为它们不被外部世界使用吗 UPDATE 我正在阅读有关闭包的内容 这让我开始思考这个关于 Python
  • 需要帮助将 BMP 图像转换为 [R] 中的矩阵吗?

    我对 R 非常陌生 我想知道是否有一种简单的方法可以将 BMP 图像转换为 R 中的矩阵 主要是 我正在寻找任何可以提供帮助的包 矩阵中每个元素的值对应于颜色 在 CRAN 软件包列表中搜索 bmp 就会出现bmp和其他一些 为了简洁起见
  • 禁用用户在 BottomSheet 上拖动

    我正在尝试禁用用户拖动BottomSheet 我想禁用的原因有两件事 1 它可以防止ListView向下滚动 2 我不希望用户使用拖动来消除 而是使用BottomSheetView 这就是我所做的 bottomSheetBehavior B
  • 基本条件覆盖与复合条件覆盖

    I m trying to get my head around the differences between these 2 coverage criteria and I can t work out how they differ
  • 将 Scrapy over Splash 与 HTTP 代理结合使用时出现“500 内部服务器错误”

    我正在尝试使用 Splash 以渲染 JavaScript 和 Tor 通过 Privoxy 以提供匿名性 在 Docker 容器中爬行 Scrapy 蜘蛛 这里是docker compose yml我正在为此使用 version 3 se
  • 为任何基准生成线图?

    我花了很多时间未能找到一个折线图生成器来生成我的基准测试结果 我只想将其插入 我尝试了很多类似谷歌的图表 API 但它仍然看起来令人困惑或看起来不优雅 我一无所知 Examples of benchmark images I wished
  • 使用 strings.xml 中的字符串数组填充 string[] 时出现问题

    编辑 哇 不知怎的 我用我问的另一个问题替换了这个问题 很高兴有这个回滚功能 这个具体问题涉及我的吸气剂上一个问题 public class Impacts extends Activity implements View OnClickL
  • 尝试失败后暂时禁用登录

    我正在尝试为我的应用程序创建一个登录屏幕 在 3 次登录尝试失败后禁用登录按钮 5 分钟 但是 在我的应用程序中 可以通过关闭应用程序并再次启动来轻松地再次启用该按钮 我该如何解决 Code public class LogIn exten
  • 从文本文件中提取表格

    我正在尝试从文本文件中提取表格 并在这里找到了几篇解决类似问题的早期帖子 然而 似乎没有一个能够有效地解决我的问题 我发现的最有帮助的答案是我之前的问题之一 R 读取 csv 文件时删除页眉 页脚和零星列标题 示例虚拟文本文件包含 gt g
  • 在 UCM 和基本 ClearCase 之间进行选择

    哪一个更好 UCM 还是基础 ClearCase 对于并行开发 我们需要UCM吗 在 ClearCase 基础上使用手动分支是否容易出错 串行开发没有意义吗 在同一个分支机构工作 一个并不比另一个更好 UCM 代表了一组不同的最佳实践 您可
  • 错误 System.DllNotFoundException:使用 Visual Studio for Mac 的 Azure 存储上的 fusion.dll

    当我关注这个公会时 我正在使用 Visual Studio for Mac https learn microsoft com en us azure storage blobs storage dotnet how to use blob
  • Node.js 的模板引擎 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我想知道 Node js
  • 迭代时安全地从数组表中删除项目

    这个问题类似于当键被删除时如何安全地迭代 lua 表但明显不同 Summary 给定一个 Lua 数组 表中的键是从1 迭代这个数组的最佳方法是什么并删除一些看到的条目 现实世界的例子 我在 Lua 数组表中有一个带时间戳的条目数组 条目始