আসুন এই সি # ক্লাসটি করা যাক (এটি জাভাতে প্রায় একই হবে)
public class MyClass {
public string A {get; set;}
public string B {get; set;}
public override bool Equals(object obj) {
var item = obj as MyClass;
if (item == null || this.A == null || item.A == null)
{
return false;
}
return this.A.equals(item.A);
}
public override int GetHashCode() {
return A != null ? A.GetHashCode() : 0;
}
}
আপনি দেখতে পাচ্ছেন, দুটি উদাহরণের সমতা কেবলমাত্র MyClass
নির্ভর করে A
। সুতরাং দুটি উদাহরণ থাকতে পারে যা সমান, তবে তাদের B
সম্পত্তিতে বিভিন্ন অংশের তথ্য রাখা ।
অনেক ভাষার একটি মান সংগ্রহের লাইব্রেরিতে (অবশ্যই সি # এবং জাভা সহ) রয়েছে একটি Set
( HashSet
সি # তে), যা একটি সংগ্রহ যা সমান দৃষ্টান্তগুলির প্রতিটি সেট থেকে কমপক্ষে একটি আইটেম ধরে রাখতে পারে।
কেউ আইটেম যুক্ত করতে, আইটেমগুলি সরাতে এবং সেটটিতে কোনও আইটেম রয়েছে কিনা তা পরীক্ষা করতে পারে। তবে সেট থেকে কোনও নির্দিষ্ট আইটেম পাওয়া কেন অসম্ভব?
HashSet<MyClass> mset = new HashSet<MyClass>();
mset.Add(new MyClass {A = "Hello", B = "Bye"});
//I can do this
if (mset.Contains(new MyClass {A = "Hello", B = "See you"})) {
//something
}
//But I cannot do this, because Get does not exist!!!
MyClass item = mset.Get(new MyClass {A = "Hello", B = "See you"});
Console.WriteLine(item.B); //should print Bye
আমার আইটেমটি পুনরুদ্ধার করার একমাত্র উপায় হ'ল সম্পূর্ণ সংগ্রহটি পুনরাবৃত্তি করা এবং সম্যতার জন্য সমস্ত আইটেম পরীক্ষা করা। তবে এর O(n)
বদলে সময় লাগে O(1)
!
আমি এখনও পর্যন্ত কোনও সেট থেকে সমর্থন করে এমন কোনও ভাষা পাইনি। আমি জানি সমস্ত "সাধারণ" ভাষা (জাভা, সি #, পাইথন, স্কালা, হাস্কেল ...) একইভাবে ডিজাইন করা হয়েছে বলে মনে হচ্ছে: আপনি আইটেম যুক্ত করতে পারেন তবে আপনি সেগুলি পুনরুদ্ধার করতে পারবেন না। এই সমস্ত ভাষা সহজ এবং স্পষ্টতই দরকারী যে কোনও কিছুকে সমর্থন করে না তার কোনও যুক্তিসঙ্গত কারণ কি নেই? তারা ঠিক সব ভুল হতে পারে না, তাই না? এমন কোনও ভাষা রয়েছে যা এটি সমর্থন করে? কোনও সেট থেকে কোনও নির্দিষ্ট আইটেম পুনরুদ্ধার করা ভুল, তবে কেন?
কয়েকটি সম্পর্কিত এসও প্রশ্ন রয়েছে:
/programming/7283338/getting-an-element-from-a-set
/programming/7760364/how-to-retrieve-actual-item-from-hashsett
Set<E>
বাস্তবায়ন কেবল Map<E,Boolean>
অভ্যন্তরে।
a == b
ক্ষেত্রে প্রতিবিম্বিত ( সর্বদা সত্য) বিরতি দেয় this.A == null
। if (item == null || this.A == null || item.A == null)
পরীক্ষা সম্ভবত অর্ডার কৃত্রিমভাবে "উচ্চ মানের" কোড তৈরি করার জন্য, অনেক থেকে "ধরা" এবং চেক করুন। আমি এই ধরণের "overchecking" এবং কোড পর্যালোচনায় সমস্ত সময় অতিরিক্ত সংশোধন করে দেখছি।
std::set
অবজেক্ট পুনরুদ্ধারকে সমর্থন করে, সুতরাং সমস্ত "সাধারণ" ভাষা আপনার বর্ণনার মতো নয়।