模組:Array length
上述文档嵌入自Module:Array length/doc。 (编辑 | 历史) 编者可以在本模块的沙盒 (创建 | 镜像)和测试样例 (创建)页面进行实验。 本模块的子页面。 |
-- This module finds the length of an array, or of a quasi-array with keys such
-- as "data1", "data2", etc., using a binary search algorithm.
local checkType = require('libraryUtil').checkType
local function midPoint(lower, upper)
return lower + math.floor((upper - lower) / 2)
end
local function makeKey(prefix, i)
if prefix then
return prefix .. tostring(i)
else
return i
end
end
local function findLength(t, prefix, i, lower, upper)
local key = makeKey(prefix, i)
if t[key] ~= nil then
if i + 1 == upper then
return i
else
lower = i
if upper then
i = midPoint(lower, upper)
return findLength(t, prefix, i, lower, upper)
else
i = i * 2
return findLength(t, prefix, i, lower, upper)
end
end
else
upper = i
i = midPoint(lower, upper)
return findLength(t, prefix, i, lower, upper)
end
end
return function (t, prefix)
checkType('Array length', 1, t, 'table')
checkType('Array length', 2, prefix, 'string', true)
local key = makeKey(prefix, 1)
if t[key] == nil then
return 0
end
return findLength(t, prefix, 2, 1, nil)
end