लुआ में, अलग से बनाई गई दो तालिकाओं "अलग" माना जाता है। लेकिन यदि आप एक बार एक टेबल बनाते हैं, तो आप इसे किसी भी चर के लिए असाइन कर सकते हैं, और जब आप उनकी तुलना करते हैं, तो लुआ आपको बताएगा कि वे बराबर हैं। दूसरे शब्दों में:
t = {}
key = { a = "a" }
t[key] = 4
key2 = key
...
t[key2] -- returns 4
तो, यह वही करने का सरल, साफ तरीका है जो आप चाहते हैं।कहीं भी key
स्टोर करें, ताकि आप इसे उपयोग करके 4
वापस पुनर्प्राप्त कर सकें। यह भी बहुत तेज़ है।
यदि आप वास्तव में ऐसा नहीं करना चाहते हैं ... अच्छा, एक तरीका है। लेकिन यह दयालु अक्षम और बदसूरत है।
पहला भाग एक समारोह बना रहा है जो दो अलग-अलग तालिकाओं की तुलना करता है। यदि दो टेबल "समकक्ष" हैं, और यदि वे नहीं हैं तो यह सच होना चाहिए। आइए इसे बराबर कॉल करें। यह इस तरह काम करना चाहिए:
equivalent({a=1},{a=1}) -- true
equivalent({a=1,b=2}, {a=1}) -- false
equivalent({a={b=1}}, {a={b=2}}) -- false
कार्य तालिकाओं कि टेबल खुद को शामिल संभाल करने पुनरावर्ती होना चाहिए,। यदि किसी तालिका में "एक दूसरे" शामिल है, तो इसमें भी बेवकूफ नहीं होना चाहिए, लेकिन इसमें अधिक तत्व हैं। मैं इस कार्यान्वयन के साथ बाहर आया; शायद वहां बेहतर लोग हैं।
local function equivalent(a,b)
if type(a) ~= 'table' then return a == b end
local counta, countb = 0, 0
for k,va in pairs(a) do
if not equivalent(va, b[k]) then return false end
counta = counta + 1
end
for _,_ in pairs(b) do countb = countb + 1 end
return counta == countb
end
मैं यहां उस समारोह को समझाने वाला नहीं हूं। मुझे उम्मीद है कि यह पर्याप्त है कि यह क्या करता है।
पहेली के दूसरे भाग में t
equivalent
फ़ंक्शन की तुलना करते समय फ़ंक्शन की तुलना करने पर शामिल है। यह सावधानीपूर्वक मेटाटेबल मैनिपुलेशन, और एक अतिरिक्त "भंडारण" तालिका के साथ किया जा सकता है।
हम मूल रूप से t
को एक impostor में बदलते हैं। जब हमारा कोड एक कुंजी के तहत एक मूल्य को स्टोर करने के लिए कहता है, तो यह इसे स्वयं में सहेजता नहीं है; इसके बजाय यह अतिरिक्त तालिका में देता है (हम उस store
पर कॉल करेंगे)। जब कोड t
किसी मान के लिए पूछता है, तो यह इसे store
में खोजता है, लेकिन इसे पाने के लिए equivalent
फ़ंक्शन का उपयोग करता है।
local function equivalent(a,b)
... -- same code as before
end
local store = {} -- this is the table that stores the values
t = setmetatable({}, {
__newindex = store,
__index = function(tbl, key)
for k,v in pairs(store) do
if equivalent(k,key) then return v end
end
end
})
प्रयोग उदाहरण:
इस कोड है
t[{a = 1}] = 4
print(t[{a = 1}]) -- 4
print(t[{a = 1, b = 2}]) -- nil
धन्यवाद। कारण मैं चाहता था कि यह एक एनएलपी कार्य के लिए था। मैं वाक्यांशों को निकालता हूं जिन्हें मैं लुआ टेबल (प्रत्येक वाक्यांश को वाक्यांश के रूप में संग्रहीत करता हूं जो तालिका.इनर्ट का उपयोग कर इंडेक्स में मैप किया जाता है) और मैं वाक्यांशों की आवृत्ति गिनना चाहता हूं। मुझे पता है कि जो कुछ मैं चाहता हूं उसे करने के अन्य तरीके हैं (उदाहरण के लिए वाक्यांश को संयोजित करें और उस कुंजी को एक कुंजी के रूप में संयोजित स्ट्रिंग का उपयोग करें) लेकिन इसके लिए अतिरिक्त कार्यान्वयन चरणों की आवश्यकता होगी और यह काफी साफ नहीं होगा। मुझे पूरा यकीन है कि आप जावा में जो चाहते हैं वह कर सकते हैं और लुआ के लिए नया होने के नाते, मैं यह देखने की कोशिश कर रहा हूं कि कोई एनालॉग – akobre01
ऐसा हैश फ़ंक्शन लिखना मुश्किल है क्योंकि ऑब्जेक्ट्स को ट्रैक करने का ऑर्डर इस बात पर निर्भर करता है कि कैसे यह बनाया गया था और उसी प्रविष्टियों के साथ तालिकाओं में अलग-अलग ट्रैवर्सल हो सकते हैं। – lhf
यही कारण है कि मैंने एक टेबल में चाबियाँ एकत्र करने और लगातार कुंजी ऑर्डर सुनिश्चित करने के लिए इसे सॉर्ट करने के बारे में कहा। –