【发布时间】:2011-02-11 22:39:12
【问题描述】:
听起来像是一个“让我为你搜索”的问题,但不知何故我找不到答案。 Lua # 运算符只计算带有整数键的条目,table.getn 也是如此:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- prints "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- prints "2"
如何在不计算的情况下获得所有个条目的数量?
【问题讨论】:
-
@lhf:我编写了一个序列化程序,它会记住它看到的每个对象,并且下次看到它时它会发出一个整数引用而不是对象。写这个的自然方式类似于
dictionary[value] = #dictionary + 1,其中#表示所有对象的数量。 我想知道为什么你不想要这个:在所有 sane 用例中#(参见 kaizer.se 的回答),所有对象的计数完全等于 # 已经返回的;似乎让 #count everything 严格来说是一种改进。当然,我是 Lua 新手,可能没有抓住重点。 -
@lhf 另一个使用示例:将大量数据检索到一个表中,其中每个数据项都有一个唯一的字符串标识符。我使用这个标识符作为键,因为我稍后会用它来查找。我现在想打印处理的数据项的数量。我必须保留一个计数器并为每一行手动增加它。当然不是什么大不了的事,但不数数就不能说出这样的事情是不寻常的,因为你问“为什么”...... :)
-
当用作容器时,该表是保存有关当前对象计数信息的最佳位置。例如,当表格用作 Set 时。
-
@lhf:我还有一个用例,我需要知道数字,在这种情况下,我需要知道表格中是否只剩下一个项目,在这种情况下我会处理它与如果有很多项目不同。如果答案是我们计算它们,那很好;我猜一个刚刚得到答案的函数会降低我们在其他地方的性能(这样的功能可能需要 lua 每次我们设置表值时都测试新旧值是否为 nil,然后相应地更新计数器)
-
@Alternator,要测试表中是否正好有一对,请使用
next(t)~=nil and next(next(t))==nil。
标签: lua