我想确保随机生成的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 )
答案 0 :(得分:2)
Lua没有允许你尝试做的事情的设施。也就是说,没有metamethod技巧可以使两个不同的userdata或两个不同的表映射到表索引系统的相同索引。
您必须手动执行此操作。通过保持向量列表排序,您可以有效地编写自己的集合。 table.sort
可以完成这项工作,因为您已经拥有适当的__lt
元方法。
答案 1 :(得分:0)
如果有人有兴趣:我已经提出了另一种对我有用的解决方法。
可以使用一组x坐标,而不是仅使用&#34; true&#34;来设置项目。或者&#34; 1&#34;,各自的值(y坐标)设置;等等。
这导致树状结构,其中每个叶子的路径表示一个点(坐标序列),具有相同第一坐标的点具有共同的父节点。所有积分都是独一无二的。