Programming

루아 테이블에서 항목 수를 얻는 방법은 무엇입니까?

procodes 2020. 7. 17. 21:59
반응형

루아 테이블에서 항목 수를 얻는 방법은 무엇입니까?


"Google에 알려주세요"라는 질문처럼 들리지만 어떻게 든 답을 찾을 수 없습니다. 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"

항목을 세지 않고 모든 항목 수를 얻으려면 어떻게합니까 ?


당신은 이미 문제에 대한 해결책을 가지고 있습니다-유일한 방법은 전체 테이블을 반복하는 것입니다 pairs(..).

function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

또한 "#"연산자의 정의는 그보다 약간 더 복잡합니다. 이 표를 통해이를 설명해 드리겠습니다.

t = {1,2,3}
t[5] = 1
t[9] = 1

매뉴얼에 따라 임의의 3, 5, 9의 결과는 유효하다 #t. 그것을 사용하는 유일한 방법은 nil 값이없는 하나의 인접한 부분의 배열입니다.


항목 수를 추적하기 위해 메타 테이블을 설정할 수 있습니다.이 정보가 자주 필요한 경우 반복보다 빠를 수 있습니다.


한 가지 방법이 있지만 실망 스러울 수 있습니다. 카운트를 저장하기 위해 추가 변수 (또는 테이블 필드 중 하나)를 사용하고 삽입 할 때마다 증가시킵니다.

count = 0
tbl = {}

tbl["test"] = 47
count = count + 1

tbl[1] = 48
count = count + 1

print(count)   -- prints "2"

다른 방법은 없습니다. # 연산자는 연속 키가있는 배열 형 테이블에서만 작동합니다.


펜 라이트 라이브러리를 사용할 수 있습니다 . size테이블의 실제 크기를 제공 하는 기능이 있습니다 .

Lua에서 프로그래밍하고 누락하는 동안 필요할 수있는 많은 기능을 구현했습니다.

다음은이를 사용하기위한 샘플입니다.

> tablex = require "pl.tablex"
> a = {}
> a[2] = 2
> a[3] = 3 
> a['blah'] = 24

> #a
0

> tablex.size(a)
3

local function CountedTable(x)
    assert(type(x) == 'table', 'bad parameter #1: must be table')

    local new_t = {}
    local mt = {}

    -- `all` will represent the number of both
    local all = 0
    for k, v in pairs(x) do
        all = all + 1
    end

    mt.__newindex = function(t, k, v)
        if v == nil then
            if rawget(x, k) ~= nil then
                all = all - 1
            end
        else
            if rawget(x, k) == nil then
                all = all + 1
            end
        end

        rawset(x, k, v)
    end

    mt.__index = function(t, k)
        if k == 'totalCount' then return all
        else return rawget(x, k) end
    end

    return setmetatable(new_t, mt)
end

local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true }

assert(bar.totalCount == 4)
assert(bar.x == 23)
bar.x = nil
assert(bar.totalCount == 3)
bar.x = nil
assert(bar.totalCount == 3)
bar.x = 24
bar.x = 25
assert(bar.x == 25)
assert(bar.totalCount == 4)

테이블의 항목 수를 얻는 가장 쉬운 방법은 '#'입니다. #tableName은 번호가 매겨진 항목 수를 가져옵니다.

tbl={
    [1]
    [2]
    [3]
    [4]
    [5]
}
print(#tbl)--prints the highest number in the table: 5

Sadly, if they are not numbered, it won't work.


seems when the elements of the table is added by insert method, getn will return correctly. Otherwise, we have to count all elements

mytable = {}
element1 = {version = 1.1}
element2 = {version = 1.2}
table.insert(mytable, element1)
table.insert(mytable, element2)
print(table.getn(mytable))

It will print 2 correctly

참고URL : https://stackoverflow.com/questions/2705793/how-to-get-number-of-entries-in-a-lua-table

반응형