2010-02-17 5 views
74

क्या तालिका में कोई मान है या नहीं, यह जांचने का कोई तरीका है? मेरे पास मेरा अपना (बेवकूफ) कार्य है, लेकिन मैं सोच रहा था कि उसके लिए कुछ "आधिकारिक" मौजूद है या नहीं? या अधिक कुशल कुछ ...कैसे जांचें कि तालिका में लुआ में कोई तत्व है या नहीं?

function table.contains(table, element) 
    for _, value in pairs(table) do 
    if value == element then 
     return true 
    end 
    end 
    return false 
end 

वैसे, इसका मुख्य कारण है कि मैं इस कार्यों का उपयोग कर रहा, सेट के रूप में तालिकाओं का उपयोग करने के लिए यानी कोई डुप्लिकेट तत्वों के साथ है। क्या मैं कुछ और उपयोग कर सकता हूं?

+2

_, नोटेशन का क्या अर्थ है? – Martin

+18

यह केवल "कचरा" चर है जिसे '_' नाम दिया गया है। 'जोड़े()' रिटर्न 'कुंजी, मान', लेकिन इस उदाहरण में मुझे केवल मूल्य की आवश्यकता है। यह एक तरह का एक सम्मेलन है (किताब "प्रोग्रामिंग इन लूआ" http://www.lua.org/pil/index.html) में इस '_' चर का उपयोग करने के लिए चीजों को स्टोर करने के लिए योन की आवश्यकता नहीं है। – Wookai

उत्तर

91

आप मानों को तालिका की चाबियाँ के रूप में रख सकते हैं। उदाहरण के लिए:

function addToSet(set, key) 
    set[key] = true 
end 

function removeFromSet(set, key) 
    set[key] = nil 
end 

function setContains(set, key) 
    return set[key] ~= nil 
end 

एक अधिक पूर्ण-विशेषीकृत उदाहरण here है।

+12

एक अनाम उपयोगकर्ता ने आपके कोड पर निम्न फ़िक्स का प्रस्ताव दिया है: यदि निर्दिष्ट कुंजी के साथ सेट में मान गलत है तो फ़ंक्शन सेटकंट्स() एक झूठी रिटर्न देता है हालांकि निर्दिष्ट कुंजी के साथ तालिका में कोई आइटम होता है। रेखा "वापसी सेट [कुंजी] ~ = शून्य" उस त्रुटि को हल करता है। – oers

2

मैं मानों की तुलना करने के लिए एक और तरीका नहीं सोच सकता, लेकिन यदि आप कुंजी के रूप में सेट के तत्व का उपयोग करते हैं, तो आप मूल्य को शून्य के अलावा किसी अन्य चीज़ पर सेट कर सकते हैं। फिर आप पूरी तालिका को खोजे बिना तेज़ लुकअप प्राप्त करते हैं।

22

अपने प्रतिनिधित्व को देखते हुए, आपका कार्य उतना ही कुशल है जितना किया जा सकता है। बेशक, जैसा कि अन्य लोगों द्वारा उल्लेख किया गया है (और जैसा कि लुआ से पुराने भाषाओं में प्रचलित है), आपकी वास्तविक समस्या का समाधान प्रतिनिधित्व को बदलना है। जब आपके पास टेबल होते हैं और आप सेट चाहते हैं, तो आप सेट तत्व को कुंजी के रूप में सेट करके true मान के रूप में सेट में बदल देते हैं। इंटरजे के लिए +1।

0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं वंशावली के लिए कुछ जोड़ना चाहता था। आपके पास जो समस्या है, उसे संभालने का सरल तरीका कुंजी के मूल्य की एक और तालिका बनाना है।

यानी। आपके पास 2 टेबल हैं जिनके समान मूल्य है, एक दिशा को इंगित करता है, एक दूसरे को इंगित करता है।

function addValue(key, value) 
    if (value == nil) then 
     removeKey(key) 
     return 
    end 
    _primaryTable.key = value 
    _secodaryTable.value = key 
end 

function removeKey(key) 
    local value = _primaryTable.key 
    if (value == nil) then 
     return 
    end 
    _primaryTable.key = nil 
    _secondaryTable.value = nil 
end 

function getValue(key) 
    return _primaryTable.key 
end 

function containsValue(value) 
    return _secondaryTable.value ~= nil 
end 

फिर आप नई तालिका से पूछ सकते हैं कि यह कुंजी 'तत्व' है या नहीं। यह अन्य तालिका के हर मूल्य के माध्यम से पुन: प्रयास करने की आवश्यकता को रोकता है।

यदि यह पता चला है कि आप वास्तव में 'तत्व' को कुंजी के रूप में उपयोग नहीं कर सकते हैं, क्योंकि यह उदाहरण के लिए एक स्ट्रिंग नहीं है, तो उदाहरण के लिए चेकसम या 'टॉस्ट्रिंग' जोड़ें, और उसके बाद इसे उपयोग करें कुंजी।

आप ऐसा क्यों करना चाहते हैं? यदि आपकी टेबल बहुत बड़ी हैं, तो प्रत्येक तत्व के माध्यम से पुनरावृत्ति करने के लिए समय की मात्रा महत्वपूर्ण होगी, जो आपको इसे अक्सर करने से रोकती है। अतिरिक्त मेमोरी ओवरहेड अपेक्षाकृत छोटा होगा, क्योंकि यह उसी ऑब्जेक्ट की 2 प्रतियों की बजाय उसी ऑब्जेक्ट पर 2 पॉइंटर्स संग्रहीत करेगा। यदि आपकी टेबल बहुत छोटी हैं, तो इससे बहुत कम मायने रखता है, वास्तव में यह एक और नक्शा लुकअप करने के बजाय फिर से तेज हो सकता है।

प्रश्न का शब्द हालांकि दृढ़ता से सुझाव देता है कि आपके पास सौदा करने के लिए बड़ी संख्या में आइटम हैं।

+0

एक अच्छी व्याख्या है, लेकिन वास्तव में चर्चा में कुछ भी नहीं जोड़ता है। अंतरराज्य के जवाब को संपादित करना शायद बेहतर विचार होता। – bcdan

+0

इसके अलावा, '.key' को इस कोड में हर जगह '[key]' के साथ प्रतिस्थापित किया जाना चाहिए ('value' के साथ) – Njol

संबंधित मुद्दे