Lua:k维点的集合

时间:2015-12-22 20:11:01

标签: lua set point

我想确保随机生成的kD点不一致。为了有效地测试这个,我想使用一个集合(至少这是我在C ++中所做的)。

我知道在Lua表中可以通过将对象作为值插入任何非零键(通常只是 true 或多重集的整数)来用作集合。 但问题是Lua中的表默认只比较w.r.t.他们的地址,即使所有的矢量成分(在我的情况下)都相等,这当然也是不同的。

所以我认为我会为我的点实现等于和/或少于元方法。但这不起作用(见下面的代码)。有人可以帮忙吗?

local k = 3
local mt = {}

mt.__eq = function( a, b )
    for dim = 1, k do
        if a[dim] ~= b[dim] then return false end
    end
    return true
end

mt.__lt = function( a, b )
    for dim = 1, k do
        if     a[dim] < b[dim] then
            return true
        elseif a[dim] > b[dim] then
            return false
        end
    end
    return false -- equal
end

local set = {}

local p1 = { 1, 2, 3 }
setmetatable( p1, mt )
set[p1] = true

local p2 = { 1, 2, 3 }
setmetatable( p2, mt )
set[p2] = true -- should just overwrite the old value

print( "p1 == p2 --> "..tostring( p1 == p2 ) )
print( "p1 <  p2 --> "..tostring( p1 <  p2 ) )

local setSize = 0
for _, _ in pairs( set ) do
    setSize = setSize + 1
end
print( "Size of the set: "..setSize )

2 个答案:

答案 0 :(得分:2)

Lua没有允许你尝试做的事情的设施。也就是说,没有metamethod技巧可以使两个不同的userdata或两个不同的表映射到表索引系统的相同索引。

您必须手动执行此操作。通过保持向量列表排序,您可以有效地编写自己的集合。 table.sort可以完成这项工作,因为您已经拥有适当的__lt元方法。

答案 1 :(得分:0)

如果有人有兴趣:我已经提出了另一种对我有用的解决方法。

可以使用一组x坐标,而不是仅使用&#34; true&#34;来设置项目。或者&#34; 1&#34;,各自的值(y坐标)设置;等等。

这导致树状结构,其中每个叶子的路径表示一个点(坐标序列),具有相同第一坐标的点具有共同的父节点。所有积分都是独一无二的。