কোনও টেবিলে লুয়ার কোনও উপাদান রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


99

কোনও টেবিলে কোনও মান রয়েছে কিনা তা পরীক্ষা করার জন্য কি কোনও পদ্ধতি আছে? আমার নিজস্ব (নিষ্পাপ) ফাংশন আছে, তবে আমি ভাবছিলাম যে এর জন্য কিছু "অফিসিয়াল" আছে কিনা? বা আরও দক্ষ কিছু ...

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

যাইহোক, আমি এই ফাংশনগুলি ব্যবহার করছি তার প্রধান কারণটি হ'ল টেবিলগুলি সেট হিসাবে ব্যবহার করা, অর্থাত্ কোনও নকল উপাদান ছাড়াই। আমি ব্যবহার করতে পারে অন্য কিছু আছে?


4
_, স্বরলিপি বলতে কী বোঝায়?
মার্টিন

24
এটি কেবল একটি "আবর্জনা" নামক ভেরিয়েবল _pairs()ফিরে আসে key, value, তবে এই উদাহরণে আমার কেবল মান দরকার। আপনার পরিবর্তনীয় জিনিসগুলি সংরক্ষণ করার জন্য এই পরিবর্তনশীলটি ব্যবহার করার জন্য এটি একটি কনভেনশন ("লুয়া প্রোগ্রামিং ইন লুয়া" বইয়ে গৃহীত হয়েছে lua.org/pil/index.html ) is _
Wookai

আমি _পাইথন এবং জাভাস্ক্রিপ্টে ব্যবহৃত "আবর্জনা" ভেরিয়েবলগুলির নামকরণের সম্মেলনটিও দেখেছি ।
আয়নো

উত্তর:


118

আপনি মানগুলি টেবিলের কী হিসাবে রাখতে পারেন। উদাহরণ স্বরূপ:

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

এখানে আরও একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত উদাহরণ রয়েছে


13
একজন অনামী ব্যবহারকারী আপনার কোডটিতে নিম্নলিখিত ফিক্সের প্রস্তাব দিয়েছেন: নির্দিষ্ট কী সহ সেটের মান যদি মিথ্যা হয় তবে নির্দিষ্ট কী সহ টেবিলের মধ্যে কোনও আইটেম থাকলেও ফাংশন সেট কনটেনস () একটি মিথ্যা প্রদান করে। "রিটার্ন সেট [কী] ~ = শূন্য" লাইনটি ত্রুটিটি ঠিক করে।
ওস

সম্ভবত এটিওfunction keysOfSet(set) local ret={} for k,_ in pairs(set) do ret[#ret+1]=k end return ret end
জেসি চিশল্ম

24

আপনার প্রতিনিধিত্ব দেওয়া, আপনার ফাংশন করা যেতে পারে হিসাবে দক্ষ অবশ্যই, অন্যরা যেমন উল্লেখ করেছেন (এবং লুয়ার চেয়ে পুরানো ভাষায় যেমন অনুশীলন করা হয়েছে), আপনার আসল সমস্যার সমাধান হল প্রতিনিধিত্ব পরিবর্তন করা। আপনার যখন টেবিল থাকে এবং আপনি সেটগুলি চান, আপনি সেট উপাদানটিকে কী trueহিসাবে এবং মান হিসাবে ব্যবহার করে টেবিলগুলি সেটগুলিতে পরিণত করেন। ইন্টারজয়কে +1 করুন।


3

আমি জানি এটি একটি পুরানো পোস্ট, তবে আমি উত্তরোত্তর জন্য কিছু যুক্ত করতে চেয়েছিলাম। আপনার কাছে থাকা সমস্যাটি হ্যান্ডল করার সহজ উপায় হ'ল আরও একটি টেবিল তৈরি করা, মান থেকে কী।

অর্থাত্ আপনার 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

তারপরে আপনি নতুন টেবিলটিতে কী'র উপাদানটি আছে কিনা তা জানতে জিজ্ঞাসা করতে পারেন। এটি অন্যান্য সারণীর প্রতিটি মান দিয়ে পুনরাবৃত্তি করার প্রয়োজনকে বাধা দেয়।

যদি এটির সক্রিয় হয়ে যায় যে আপনি আসলে 'এলিমেন্ট' কী হিসাবে ব্যবহার করতে পারবেন না, কারণ এটি উদাহরণস্বরূপ স্ট্রিং নয়, তারপরে একটি চেকসাম বা tostringউদাহরণস্বরূপ এটিতে যুক্ত করুন এবং তারপরে কীটি ব্যবহার করুন।

আপনি কেন এটা করতে চান? যদি আপনার টেবিলগুলি খুব বড় হয় তবে প্রতিটি উপাদান দিয়ে পুনরাবৃত্তি করার সময়টি উল্লেখযোগ্য হবে, আপনাকে প্রায়শই এটি করা থেকে বিরত করে। অতিরিক্ত মেমরি ওভারহেড তুলনামূলকভাবে ছোট হবে, কারণ এটি একই বস্তুর 2 টি অনুলিপি না করে একই পয়েন্টে 2 পয়েন্টার সংরক্ষণ করবে। যদি আপনার টেবিলগুলি খুব ছোট হয়, তবে এটি অনেক কম পরিমাণে বিবেচিত হবে, অন্য মানচিত্রের অনুসন্ধানের চেয়ে এটি পুনরাবৃত্তি করা আরও দ্রুত হতে পারে।

প্রশ্নের শব্দগঠন অবশ্য দৃ strongly়ভাবে পরামর্শ দেয় যে আপনার সাথে মোকাবেলা করার জন্য প্রচুর আইটেম রয়েছে।


একটি ভাল ব্যাখ্যা, কিন্তু সত্যই আলোচনায় কিছু জুড়ে না। ইন্টারজয়ের উত্তর সম্পাদনা করা সম্ভবত এটির চেয়ে ভাল ধারণা ছিল।
বিসিডিয়ান

4
এছাড়াও, এই কোডের যে
কোনও

2

মানগুলির তুলনা করার জন্য আমি অন্য কোনও উপায়ের কথা ভাবতে পারি না, তবে আপনি যদি সেটটির উপাদানটি কী হিসাবে ব্যবহার করেন তবে আপনি মানটিকে শূন্য ব্যতীত অন্য কোনও কিছুতে সেট করতে পারেন। তারপরে আপনি পুরো টেবিলটি অনুসন্ধান না করেই দ্রুত অনুসন্ধানগুলি পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.