【问题标题】:How to filter a Lua array inplace?如何就地过滤 Lua 数组?
【发布时间】:2018-09-17 11:56:38
【问题描述】:

如何就地过滤 Lua 数组?

例如,有一个{ 1, 5, 7 } 的数组和一个函数function(elem) return elem > 1 end,就地过滤函数应该将数组更改为{ 5, 7 }。还希望不要破坏数组上的ipairs 迭代,因此数组仍应以索引1 开头。

“数组”是指 Lua 表中以键 1 开头并遍历连续整数键直到找到 nil 的部分。与 ipairs 迭代的内容相同。

【问题讨论】:

  • 你的“Lua 数组”结构有点太严格了。 ipairs# 如您所描述的,在“带有序列”的 Lua 表上运行。但是,非正数和非整数键不会影响它们,因此可以在这样的表中使用。
  • 你发明超抽象问题只是为了写答案吗?这对任何人都有什么用?为什么需要在原地执行此操作?
  • @TomBlodget 你可能是对的。我只是给出了最简单的定义。如果有任何其他“数组”定义的解决方案可以让ipairs 工作,那也很有趣。你知道吗,我最好从我的问题中删除数组词,只关注ipairs。谢谢。
  • @Piglet 我无法判断自己是错还是不开话题。既然我提出来了,我觉得还可以……

标签: lua


【解决方案1】:

下面的函数解决了这个问题:

function filter_inplace(arr, func)
    local new_index = 1
    local size_orig = #arr
    for old_index, v in ipairs(arr) do
        if func(v, old_index) then
            arr[new_index] = v
            new_index = new_index + 1
        end
    end
    for i = new_index, size_orig do arr[i] = nil end
end

【讨论】:

    猜你喜欢
    • 2016-10-13
    • 2017-11-24
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2017-07-07
    • 2017-08-26
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多