2010-01-19 5 views
3

테이블 엔트리 인덱스를 얻을 수 없습니다. 테이블에서 항목을 제거해야합니다.테이블 엔트리 인덱스 얻기

나는 table.insert을 사용하여 테이블에 항목을 추가합니다.

또 다른 질문 : 왜 Lua는 table.remove 기능을 "오버로드"하지 않아 연관 색인으로 항목을 제거 할 수 있습니까?

답변

1

t[k]=nilt에서 k의 항목을 제거합니다.

두 번째 질문에 대한 대답은 테이블에 개별 메타 테이블을 포함 할 수 있다는 것입니다.

+0

예, 그렇지만 왜 C# 또는 Java 에서처럼 IndexOf가 없습니까? – mnn

7

테이블은 키와 값 사이의 순서가없는 일대 다 관계를 구현합니다. 즉, 특정 키 (색인)는 표에 한 번만 나타날 수 있지만 값은 여러 번 나타날 수 있습니다.

k 키를 알고있는 경우 t[k] = nil 키와 키 값을 테이블에서 제거합니다. 그러나이 작업은 테이블의 다른 키 또는 값에 영향을 미치지 않습니다.

table.inserttable.remove 함수는 배열 또는 목록을 구현하기 위해 규칙에 따라 사용되는 1부터 시작하는 순차 정수 키 집합을 통해 작동합니다. 그 목적을 위해 그들은 목록의 다른 값을 조작하여 목록을 개발 홀에서 보호합니다.

값이있는 키를 찾는 한 가지 방법은 단순히 테이블을 검색하는 것입니다. 이 작업이 두 번 이상 수행되는 경우 키/값 쌍을 반전하는 두 번째 테이블을 작성하여 값 별 조회가 색인 별 조회만큼 빠르도록하는 것이 좋습니다.

적합한 구현 방법은 가정과 필요에 따라 다릅니다. 일부 샘플은 다음과 같습니다.

-- return the first integer index holding the value 
function AnIndexOf(t,val) 
    for k,v in ipairs(t) do 
     if v == val then return k end 
    end 
end 

-- return any key holding the value 
function AKeyOf(t,val) 
    for k,v in pairs(t) do 
     if v == val then return k end 
    end 
end 

-- return all keys holding the value 
function AllKeysOf(t,val) 
    local s={} 
    for k,v in pairs(t) do 
     if v == val then s[#s+1] = k end 
    end 
    return s 
end 

-- invert a table so that each value is the key holding one key to that value 
-- in the original table. 
function Invert(t) 
    local i={} 
    for k,v in pairs(t) do 
     i[v] = k 
    end 
    return i 
end 
+0

감사합니다. 키/값 반전 접근법에 대한 다른 설명이 있으므로, "얻으실 수있는"유일한 방법은 귀하뿐입니다. 잘 했어. –