私はLuaに配列x
を持っています。私は、head = x[1]
とrest =
配列の残りの部分を設定したいと思いますので、rest[1] = x[2]
、rest[2] = x[3]
など最初の要素を配列から外す
私はこれをどのように行うことができますか?
は(注:。。元の配列が変異してしまった場合、私は気にしないJavaScriptで私がhead = x.shift()
とx
は、残りの要素を含んでいるでしょうだろう)
私はLuaに配列x
を持っています。私は、head = x[1]
とrest =
配列の残りの部分を設定したいと思いますので、rest[1] = x[2]
、rest[2] = x[3]
など最初の要素を配列から外す
私はこれをどのように行うことができますか?
は(注:。。元の配列が変異してしまった場合、私は気にしないJavaScriptで私がhead = x.shift()
とx
は、残りの要素を含んでいるでしょうだろう)
「ポップ」のビットであります誤った操作であることを意味し、テーブルの最初の要素を削除するには、残りのコンテンツを再配置する必要があります。そのため、JavaScriptやその他の言語では「シフト」という名前が使用されます。
あなたはtable.remove
をしたい:@daurnimatorが指摘するように
local t = {1,2,3,4}
local head = table.remove(t,1)
print(head)
--> 1
print(#t)
--> 3
print(t[1])
--> 2
、これはすべてのテーブル要素をシフト、Luaのランタイム内のアレイの基礎となる実装により多くの労力を必要とします。あなたはlinked listとしての要素のあなたの順序を表すために選択することができ、また
local t = {4,3,2,1}
local head = table.remove(t)
print(head)
--> 1
print(#t)
--> 3
print(t[#t])
--> 2
:あなたの代わりに、配列head
で最後の項目を呼び出し、後方あなたの配列を表現することができた場合は、table.remove()
への呼び出しは安いポップになります。この場合は、リストの先頭オフのアイテムをポップすることも安い操作です(ただし、あなたがあなたのリストにある「テール」を追跡しない限り、最後に1をプッシュすることは、ありません):
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
注意特に
は、任意のデータ構造を修正するが、あなたにチェーン内の特定のリンク上rest
ハンドルを与えないこと。
妥当なサイズの配列の場合、これは非常に遅い操作です。あなたがなぜこれをやろうとしているのか考え直してみてください... – daurnimator
@daurnimatorあなたは "配列の_any unreasonable_ size" B-) –
これの動機を再考する代わりに、代わりに配列以外のデータ構造を使用することを検討してください。リンクリスト(Luaで作成しやすい)は、各ノードに必要なストレージを増やす代わりに、これを安価な操作にします。 – Phrogz