문제

배열이 있습니다 x 루아에서.설정하고 싶습니다 head = x[1] 그리고 rest = 배열의 나머지 부분은 rest[1] = x[2], rest[2] = x[3], 등.

어떻게 해야 하나요?

(메모:원래 배열이 변경되어도 상관 없습니다.자바스크립트에서는 할 것입니다 head = x.shift() 그리고 x 나머지 요소가 포함됩니다.)

도움이 되었습니까?

해결책

head = table.remove(x, 1)

"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가 이전에 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top