2011-02-05 14 views
5

से पहले तत्व को रोकना मेरे पास लुआ में x है। मैं, head = x[1] और rest = सरणी के बाकी सेट करना चाहते हैं ताकि rest[1] = x[2], rest[2] = x[3], आदिएक सरणी

मैं यह कैसे कर सकते हैं?

(ध्यान दें: मुझे परवाह नहीं है अगर मूल सरणी उत्परिवर्तित हो जाता है जावास्क्रिप्ट में मैं head = x.shift() और x शेष तत्व होते हैं करना होगा।।)

उत्तर

12

head = table.remove(x, 1)

"पॉप" का एक सा है एक misnomer, क्योंकि यह एक सस्ता ऑपरेशन का तात्पर्य है, और एक तालिका के पहले तत्व को हटाने के लिए शेष सामग्री को स्थानांतरित करने की आवश्यकता है - इसलिए जावास्क्रिप्ट और कुछ अन्य भाषाओं में नाम "शिफ्ट"।

+1

नोट, किसी भी उचित आकार की सरणी के लिए, यह एक बहुत ही धीमी गति से संचालन है; कोशिश करें और पुनर्विचार करें कि आप ऐसा क्यों करना चाहते हैं ... – daurnimator

+3

@daurnimator का मतलब है "_any unreasonable_ size" की सरणी बी-) –

+0

इसके लिए प्रेरणा पर पुनर्विचार करने के बजाय, शायद किसी सरणी के अलावा डेटा संरचना का उपयोग करने पर विचार करें। एक लिंक की गई सूची (लुआ में बनाने में आसान) प्रत्येक नोड के लिए आवश्यक अधिक संग्रहण की कीमत पर, यह एक सस्ता ऑपरेशन बनाती है। – Phrogz

3

आप 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 बताते हैं, यह लुआ क्रम में सरणियों के अंतर्निहित कार्यान्वयन, सभी तालिका तत्वों के स्थानांतरण द्वारा प्रयास का एक बहुत आवश्यकता है। आप इसके बजाय अपने सरणियों पीछे की ओर का प्रतिनिधित्व करते हैं, सरणी head में अंतिम आइटम बुला सकते हैं, तो table.remove() करने के लिए कॉल एक सस्ते पॉप होगा:

local t = {4,3,2,1} 
local head = table.remove(t) 
print(head) 
--> 1 
print(#t) 
--> 3 
print(t[#t]) 
--> 2 

वैकल्पिक रूप से, आप के रूप में एक linked list तत्वों के अपने अनुक्रम का प्रतिनिधित्व करने के लिए चुन सकते हैं । इस मामले में, सूची के सिर बंद एक आइटम पॉपिंग भी एक सस्ते ऑपरेशन है (लेकिन अंत पर एक जोर दे, नहीं है जब तक कि आप अपनी सूची में 'पूंछ' का ट्रैक रखने के):

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 संभाल देता है।