2014-09-09 2 views
1

테이블에서 모든 값을 삭제하고 싶습니다. 자, 어떻게 처리해야하는지 알 수있는 아주 작은 문제가 있습니다.테이블에 지정된 값을 가진 모든 항목을 제거하십시오.

function(list_to_search_in, compared_value, invert) 
    for k,v in pairs(list_to_search_in) do 
     if invert and v ~= compared_value then 
      table.remove(list_to_search_in, v) 
     if not invert and v == compared_value then 
      table.remove(list_to_search_in, v) 
     end 
    end 
end 

문제점 :

가의 테이블이 { 1, 2, 3, 2 }입니다 가정 해 봅시다

는 코드입니다. 따라서 루프를 반복하면서 첫 번째 경기를 시작하면 테이블에서 제거됩니다. 이는 값과 키가 삭제되었음을 의미합니다.

이제 삭제 된 값의 키가 다음 줄에 할당됩니다. 그러나 스크립트가 다음 키의 값을 검사 할 것이기 때문에이 값 (kay는 방금 변경되었습니다)은 확인되지 않습니다. 제거 후

생각, 간단한

k = k - 1 

일을 할 것이지만, 그렇지 않습니다.

v = nil 

내가 생각하는 훌륭한 할 것이나, 가비지 컬렉터는 다음 값이 순간에 쌍 반복을 자신의 일을하지 않는 경우에만.

누구나 아이디어가 있습니까? 문제를 해결하는 완성 된 구문에 대한 텍스트 기반 힌트를 선호합니다.

+2

참조 http://stackoverflow.com/questions/12394841/safely-remove-items-from-an-array-table- while-iterating. 특히, 내 대답 http://stackoverflow.com/a/12397742/107090. – lhf

+0

그래서 다른 방법으로 두 번째 테이블을 만들 수 있습니까? 저는 마이크로 컨트롤러에서 lua를 사용하고 있습니다. 게임을 스크립팅하는 것이 아닙니다. 따라서 성능은 나에게 큰 문제입니다. – Sempie

+1

내 대답은 두 번째 테이블을 만들지 않습니다. 삭제할 항목을 표시 한 다음 원본 테이블을 압축합니다. – lhf

답변

1

table.remove을 사용하지 마십시오. 배열과 같은 테이블에서 "구멍"을 쥐어 짜냅니다. 반복 중에는 pairs/next을 사용하는 것은 허용되지 않습니다. 값을 nil으로 설정하면됩니다.

테이블에서 구멍을 뺄 필요가 있으면 새 테이블을 만들고 유지하려는 값으로 채우거나 첫 번째 패스 중에 제거를 수행 한 다음 두 번째 패스에서 구멍을 뽑습니다 .

pairs을 사용할 때 항목 순회는 어떤 식 으로든 보장되지 않습니다.

+0

그러나 테이블이 실제로 커지면 carbage 수집기가 반복 중에 nil-value-keys 중 일부를 삭제할 수 있습니까? afaik, 수집가가 그의 일을 할 때, 결코 알 수 없다, 그렇지? – Sempie

+0

큰 문제 : 테이블에 nil 값이 없어야합니다. – Sempie

+0

Lua 테이블에서 'nil'값을 설정하면 해당 항목이 삭제됩니다. –

관련 문제