একটি Set হলো এমন একটি কলেকশন যার কোনো নির্দিষ্ট ক্রম নেই এবং যা (List-এর বিপরীতে) কোনো ডুপ্লিকেট মান ধারণ করে না।
Set ইন্টারফেসের জেনেরিক টাইপ প্যারামিটার দিয়ে বোঝানো হয় Set-এর ভেতরে থাকা এলিমেন্টগুলোর ডেটা টাইপ কী:
Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");
খেয়াল করুন, Set.of() মেথডটি একটি অপরিবর্তনীয় Set ইনস্ট্যান্স তৈরি করে।
এই ইনস্ট্যান্সে add ও remove-এর মতো মেথড কল করার চেষ্টা করলে রানটাইমে একটি এক্সেপশন হবে।
পরিবর্তনযোগ্য Set তৈরি করতে হলে Set ইন্টারফেস ইমপ্লিমেন্ট করে এমন একটি ক্লাস ইনস্ট্যান্টিয়েট করতে হবে।
এই ইন্টারফেস ইমপ্লিমেন্ট করা সবচেয়ে বেশি ব্যবহৃত বিল্ট-ইন ক্লাসটি হলো HashSet ক্লাস।
Set<Integer> ints = new HashSet<>();
Set ইন্টারফেসটি Collection ও Iterable ইন্টারফেস থেকে এক্সটেন্ড করা হয়েছে, তাই এটি অন্য ধরনের কলেকশনের সাথে অনেক মেথড শেয়ার করে।
তবে Collection ইন্টারফেসের সাথে একটি লক্ষণীয় পার্থক্য হলো, add ও remove-এর মতো মেথডগুলো void-এর বদলে একটি boolean রিটার্ন করে, যা জানায় মেথডটি যখন কল করা হয়েছিল তখন ওই আইটেমটি সেটে ছিল কি না:
Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1
Blorkemon™️ কার্ডের প্রতি আপনার নস্টালজিয়া যেন কিছুতেই কমছে না, আপনি আবার সেগুলো সংগ্রহ করাও শুরু করেছেন, আর বন্ধুদেরও নিজের সাথে যোগ করাচ্ছেন।
এই অনুশীলনীতে আপনি আপনার সংগ্রহ পরিচালনা করতে Set ইন্টারফেস ব্যবহার করবেন, কারণ আপনার লক্ষ্য যখন বিদ্যমান সব কার্ড সংগ্রহ করা, তখন ডুপ্লিকেট কার্ড গুরুত্বপূর্ণ নয়।
আপনি এইমাত্র আপনার পুরনো Blorkemon™️ কার্ডের ভাণ্ডার খুঁজে পেয়েছেন! ভাণ্ডারে অনেক ডুপ্লিকেট কার্ড আছে, তাই ডুপ্লিকেটগুলো সরিয়ে একটি নতুন সংগ্রহ শুরু করার সময় এসেছে।
আপনি সত্যিই চান আপনার বন্ধুরাও আপনার Blorkemon™️ উন্মাদনায় যোগ দিন, আর এর সবচেয়ে ভালো উপায় হলো তাদের একটি কার্ড দিয়ে তাদের সংগ্রহ শুরু করে দেওয়া।
newCollection মেথডটি ইমপ্লিমেন্ট করুন, যা কার্ডের একটি অ্যারে-কে আপনার নতুন সংগ্রহ নির্দেশ করে এমন একটি Set-এ রূপান্তর করে।
GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}
একবার সংগ্রহ তৈরি হয়ে গেলে তা নিজের জীবন পেয়ে যায় এবং বাড়তেই হবে।
addCard মেথডটি ইমপ্লিমেন্ট করুন, যা একটি নতুন কার্ড এবং আপনার সংগৃহীত কার্ডের বর্তমান সেট নেয়।
মেথডটি নতুন কার্ডটি যদি ইতিমধ্যে সংগ্রহে না থাকে তবে তা যোগ করবে, এবং সংগ্রহটি আপডেট হয়েছে কি না তা নির্দেশ করে একটি boolean রিটার্ন করবে।
Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true
collection.contains("Scientuna");
// => true
আপনি সত্যিই চান আপনার বন্ধুরাও আপনার Blorkemon™️ উন্মাদনায় যোগ দিন, তাই এখন ট্রেড করা শুরু করার সময়!
বন্ধুদের সাথে ট্রেড করার সময় প্রতিটি ট্রেডই করার মতো বা আদৌ করার যোগ্য নয়। আপনার এবং আপনার বন্ধুর কেবল তখনই ট্রেড করা উচিত, যখন দুজনের কাছেই এমন একটি কার্ড থাকে যা অন্যজনের নেই।
canTrade মেথডটি ইমপ্লিমেন্ট করুন, যা আপনার বর্তমান সংগ্রহ এবং আপনার একজন বন্ধুর সংগ্রহ নেয়।
উপরের নিয়ম অনুসরণ করে ট্রেড সম্ভব কি না তা নির্দেশ করে এটি একটি boolean রিটার্ন করবে।
Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true
আপনি এবং আপনার Blorkemon™️ উৎসাহী বন্ধুরা একত্র হন এবং ভাবেন কোন কার্ডগুলো সবচেয়ে কমন।
commonCards মেথডটি ইমপ্লিমেন্ট করুন, যা সংগ্রহের একটি অ্যারে নেয় এবং এমন কার্ডের একটি সংগ্রহ রিটার্ন করে যা সকল সংগ্রহে আছে।
GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}
আপনি এবং আপনার বন্ধুরা মিলে কি সব Blorkemon™️ কার্ডের মালিক?
allCards মেথডটি ইমপ্লিমেন্ট করুন, যা সংগ্রহের একটি অ্যারে নেয় এবং সব সংগ্রহ একসাথে মিলিয়ে সব ভিন্ন কার্ডের একটি সংগ্রহ রিটার্ন করে।
GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}
Exercism-এ সাইন আপ করুন, Java ট্র্যাকের 26টি কনসেপ্ট158টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।