문제
배열이 있습니다 x
루아에서.설정하고 싶습니다 head = x[1]
그리고 rest =
배열의 나머지 부분은 rest[1] = x[2]
, rest[2] = x[3]
, 등.
어떻게 해야 하나요?
(메모:원래 배열이 변경되어도 상관 없습니다.자바스크립트에서는 할 것입니다 head = x.shift()
그리고 x
나머지 요소가 포함됩니다.)
해결책
"POP"는 저렴한 작동을 의미하며 테이블의 첫 번째 요소를 제거하는 것은 비트 노래가 있습니다. 따라서 나머지 내용은 JavaScript와 다른 언어로 "Shift"라는 이름을 재배치해야합니다.
다른 팁
당신이 원하는 table.remove
:
local t = {1,2,3,4}
local head = table.remove(t,1)
print( head )
--> 1
print( #t )
--> 3
print( t[1] )
--> 2
@daurnimator가 지적했듯이 이를 위해서는 Lua 런타임의 기본 배열 구현에 많은 노력이 필요하며 모든 테이블 요소를 이동합니다.대신 배열을 거꾸로 표현할 수 있는 경우 배열의 마지막 항목을 호출합니다. head
, 그런 다음 호출 table.remove()
싸구려 팝이 될 것입니다 :
local t = {4,3,2,1}
local head = table.remove(t)
print(head)
--> 1
print( #t )
--> 3
print( t[#t] )
--> 2
또는 요소 시퀀스를 다음과 같이 표시하도록 선택할 수도 있습니다. 연결리스트.이 경우 목록의 머리 부분에서 항목을 꺼내는 것도 저렴한 작업입니다(그러나 목록의 '꼬리'를 추적하지 않는 한 항목을 끝으로 밀어내는 것은 그렇지 않습니다).
local setm,getm = setmetatable,getmetatable
local linkedlist=setm({__index={
tail = function(l) while l.rest do l=l.rest end return l end, -- N.B. O(n)!
push = function(l,v,t) t=l:tail() t.rest=setm({val=v},getm(l)) return t end,
cram = function(l,v) return setm({val=v,rest=l},getm(l)) end,
each = function(l,v)
return function() if l then v,l=l.val,l.rest return v end end
end
}},{ __call=function(lmeta,v,...)
local head,tail=setm({val=v},lmeta) tail=head
for i,v in ipairs{...} do tail=tail:push(v) end
return head
end })
local numbers = linkedlist(1,2,3,4)
for n in numbers:each() do print(n) end
--> 1
--> 2
--> 3
--> 4
local head,rest = numbers.val, numbers.rest
print(head)
--> 1
for n in rest:each() do print(n) end
--> 2
--> 3
--> 4
local unrest = rest:cram('99')
for n in unrest:each() do print(n) end
--> 99
--> 2
--> 3
--> 4
특히 다음 사항에 유의하세요.
local head,rest = numbers.val, numbers.rest
데이터 구조를 수정하지 않고 단지 rest
체인의 특정 링크를 처리합니다.
일반적으로 LUA에서 요소 X를 시퀀스에 삽입하는 동작 ...
과 같이 : s= {A, B, C, D, E, F} ~ s= {A, B, C, X, D, E, F}
... D는 D가 인덱스 5, E를 인덱스 6 등으로 이동시켜야하기 때문에 매우 시간이 많이 소요됩니다.
는 S [a]= b, s [b]= c, s [c]= d, s [d]= e 및 s [e]= f?그런 식으로, 당신이해야 할 일은 다음과 같습니다 :
s [c]= X. s [x]= d
및 boom, x는 두 가지 작업에서 C이고 D가 이전에 있습니다.