【问题标题】:Getting table entry index获取表项索引
【发布时间】:2011-01-06 22:18:40
【问题描述】:

我无法获取表条目索引。我需要它来从表格中删除一个项目。

我使用table.insert 向表中添加条目。

另一个问题:为什么 Lua 没有“重载”到函数 table.remove 以便可以通过关联索引删除项目?

【问题讨论】:

    标签: lua insert lua-table


    【解决方案1】:

    表在键和值之间实现了无序的一对多关系。换句话说,任何特定的键(索引)在一个表中只能出现一次,但一个值可以出现多次。

    如果您知道键 k,那么 t[k] = nil 将从表中删除键和关联的值。但是,此操作对表中的任何其他键或值都没有影响。

    table.inserttable.remove 函数对从 1 开始的连续整数键集进行操作,这些键按惯例用于实现数组或列表。为此,他们操纵列表中的其他值,以防止列表出现漏洞。

    找到某个值所在的键的一种方法是简单地搜索表。如果这将被多次执行,那么构建第二个表来反转键/值对可能是一个好主意,以便按值查找与按索引查找一样快。

    合适的实现将取决于您的假设和需求。一些示例是:

    -- return the first integer index holding the value 
    function AnIndexOf(t,val)
        for k,v in ipairs(t) do 
            if v == val then return k end
        end
    end
    
    -- return any key holding the value 
    function AKeyOf(t,val)
        for k,v in pairs(t) do 
            if v == val then return k end
        end
    end
    
    -- return all keys holding the value
    function AllKeysOf(t,val)
        local s={}
        for k,v in pairs(t) do 
            if v == val then s[#s+1] = k end
        end
        return s
    end
    
    -- invert a table so that each value is the key holding one key to that value 
    -- in the original table.
    function Invert(t)
        local i={}
        for k,v in pairs(t) do 
            i[v] = k
        end
        return i
    end
    

    【讨论】:

    • 谢谢。关于 SO 的键/值反转方法还有其他解释,但你的解释是唯一帮助我“得到它”的解释。干得好。
    【解决方案2】:

    t[k]=nilt 中删除键为k 的条目。

    对于第二个问题,答案是表可以有单独的元表。

    【讨论】:

    • 是的,但为什么没有 C# 或 Java 中的 IndexOf?
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多