তুলনাকারী, বাছাই সংগ্রহ - 1

"হাই, অ্যামিগো!"

"হাই, বিলাবো!"

"আজ আমরা একটি ছোট, কিন্তু আকর্ষণীয় এবং দরকারী বিষয় পরীক্ষা করব: সংগ্রহ বাছাই।"

"বাছাই? আমি যে সম্পর্কে কিছু শুনেছি."

"অনেক আগে, প্রত্যেক প্রোগ্রামারকে বাছাই করার অ্যালগরিদম লিখতে সক্ষম হতে হয়েছিল। সেগুলি লিখতে সক্ষম ছিল এবং করতে হয়েছিল। কিন্তু সেই দিনগুলি শেষ হয়ে গেছে। আজ আপনার নিজের সাজানোর কোড লেখাকে খারাপ ফর্ম হিসাবে বিবেচনা করা হয়, ঠিক অন্য কিছু যা ইতিমধ্যেই আছে তা পুনরায় লেখার মতো। উদ্ভাবিত হয়েছে।"

"জাভাতে (এবং অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজ), বাছাই করা ইতিমধ্যেই কার্যকর করা হয়েছে।  আপনার কাজ হল আগে থেকে বিদ্যমান যা সঠিকভাবে ব্যবহার করতে হয় তা শিখতে হবে। "

"ঠিক আছে."

" সংগ্রহ সহায়ক শ্রেণীতে একটি স্ট্যাটিক বাছাই পদ্ধতি রয়েছে যা সংগ্রহগুলিকে সাজানোর জন্য ব্যবহার করা হয়—বা আরও স্পষ্টভাবে, তালিকাগুলি। মানচিত্র এবং সেটগুলির উপাদানগুলির কোনও অর্ডার/সূচী নেই, তাই সাজানোর কিছু নেই।"

"হ্যাঁ, আমার মনে আছে। সংখ্যার তালিকা সাজানোর জন্য আমি একবার এই পদ্ধতিটি ব্যবহার করেছিলাম।"

"দারুণ। কিন্তু এই পদ্ধতিটি প্রথম নজরে যা মনে হয় তার চেয়ে অনেক বেশি শক্তিশালী। এটি যেকোন মানদণ্ডের উপর ভিত্তি করে শুধুমাত্র সংখ্যাই নয়, যেকোনো বস্তুকেও সাজাতে পারে। দুটি ইন্টারফেস পদ্ধতিটিকে এটি করতে সাহায্য করে: তুলনাযোগ্য এবং তুলনাকারী "

"কখনও কখনও আপনাকে বস্তুগুলিকে সাজাতে হবে, সংখ্যা নয়৷ উদাহরণস্বরূপ, ধরুন আপনার কাছে মানুষের একটি তালিকা আছে এবং আপনি তাদের বয়স অনুসারে বাছাই করতে চান৷ এর জন্য আমাদের কাছে তুলনাযোগ্য ইন্টারফেস আছে ৷ "

"আমাকে প্রথমে একটি উদাহরণ দেখাই, এবং তারপর সবকিছু পরিষ্কার হয়ে যাবে:"

উদাহরণ
public class Woman implements Comparable<Woman>
{
public int age;

public Woman(int age) {
this.age = age;
}

public int compareTo(Woman o)
{
return this.age - o.age;
}
}
এটি কীভাবে ব্যবহার করা যেতে পারে তার একটি উদাহরণ:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Collections.sort(women);
}

"অবজেক্টগুলিকে সাজানোর জন্য, আপনাকে প্রথমে তাদের তুলনা করতে জানতে হবে। এর জন্য, আমরা তুলনাযোগ্য ব্যবহার করি। তুলনাযোগ্য ইন্টারফেসটি একটি জেনেরিক, যার মানে এটি একটি টাইপ আর্গুমেন্ট গ্রহণ করে। এটির শুধুমাত্র একটি জেনেরিক পদ্ধতি রয়েছে: compareTo(To)। এই পদ্ধতিটি বর্তমান অবজেক্ট (এটি) এবং একটি আর্গুমেন্ট (o) হিসাবে পাস করা একটি বস্তুর তুলনা করে। অন্য কথায়, আমাদের আমাদের ক্লাসে এই পদ্ধতিটি প্রয়োগ করতে হবে এবং তারপরে পাস করা বস্তুর সাথে বর্তমান অবজেক্ট (এটি) তুলনা করতে এটি ব্যবহার করতে হবে। "

"এবং তুলনাটি কীভাবে কাজ করে? আমি আশা করেছিলাম যে পাস করা বস্তুটি বড় না ছোট তার উপর নির্ভর করে এটি সত্য বা মিথ্যা ফিরে আসবে।"

"এখানে জিনিসগুলি আরও জটিল। compareTo পদ্ধতিটি সত্য/মিথ্যা ফেরত দেয় না। পরিবর্তে, এটি একটি int প্রদান করে। এটি আসলে সরলতার জন্য করা হয়।

"যখন একটি কম্পিউটারের একটি সংখ্যা অন্যটির চেয়ে বড় কিনা তা নির্ধারণ করার প্রয়োজন হয়, তখন এটি কেবল প্রথম থেকে দ্বিতীয় সংখ্যাটি বিয়োগ করে এবং তারপর ফলাফলটি দেখে৷ যদি ফলাফলটি 0 হয়, তাহলে সংখ্যাগুলি সমান৷ যদি ফলাফলটি শূন্যের কম হয়৷ , তাহলে দ্বিতীয় সংখ্যাটি বৃহত্তর। এবং যদি ফলাফলটি শূন্যের চেয়ে বড় হয়, তাহলে প্রথম সংখ্যাটি বড়।"

"একই যুক্তি এখানে প্রযোজ্য। স্পেসিফিকেশন অনুযায়ী, compareTo পদ্ধতিটি অবশ্যই শূন্য প্রদান করবে যদি তুলনা করা বস্তু সমান হয়। যদি compareTo পদ্ধতিটি শূন্যের চেয়ে বড় একটি সংখ্যা প্রদান করে, তাহলে আমাদের বস্তুটি পাস করা বস্তুর চেয়ে বড়। "যদি compareTo পদ্ধতি পদ্ধতিটি শূন্যের চেয়ে কম একটি সংখ্যা প্রদান করে, তারপর 'এটি' পাস করা বস্তুর চেয়ে কম।"

"এটা একটু অদ্ভুত।"

"হ্যাঁ, কিন্তু আপনি যদি কিছু সাংখ্যিক সম্পত্তির উপর ভিত্তি করে বস্তুর তুলনা করছেন, তাহলে আপনি কেবল একটি থেকে অন্যটি বিয়োগ করে তাদের মধ্যে পার্থক্য ফিরিয়ে দিতে পারেন। ঠিক যেভাবে এটি উপরের উদাহরণে করা হয়েছিল।"

public int compareTo(Woman o)
{
return this.age - o.age;
}

"আমার মনে হয় আমি সবই বুঝি। কিন্তু হয়তো না। কিন্তু প্রায় সবই।"

"দারুণ। এখন আসুন একটি আরও ব্যবহারিক সমস্যা বিবেচনা করা যাক। ধরুন আপনি চীনে মহিলাদের পোশাক তৈরির জন্য একটি দুর্দান্ত ওয়েবসাইট লিখেছেন। আপনি আপনার গ্রাহকদের বর্ণনা করার জন্য একটি মহিলা শ্রেণী ব্যবহার করেন। এমনকি আপনি একটি টেবিল সহ একটি ওয়েবপেজ তৈরি করেছেন যেখানে আপনি সেগুলি সব দেখতে পাবেন কিন্তু একটা সমস্যা আছে..."

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

"ব্যবহারকারীদের টেবিলে প্রচুর কলাম আছে, এবং এখানে প্রশ্ন: আপনি কীভাবে আপনার ব্যবহারকারীদের বিভিন্ন মানদণ্ড অনুসারে বাছাই করবেন? ওজন অনুসারে, বয়স অনুসারে, পদবি অনুসারে?"

"হুম। হ্যাঁ, আমি প্রায়ই টেবিল দেখি যেগুলো আপনাকে কলাম অনুসারে সাজাতে দেয়। তাহলে, আপনি কিভাবে করবেন?"

"এর জন্য, আমাদের কাছে দ্বিতীয় ইন্টারফেসটি রয়েছে যা আমি আপনাকে আজ বলতে চেয়েছিলাম: তুলনাকারী ইন্টারফেস। এটির একটি তুলনা পদ্ধতিও রয়েছে, তবে এটির জন্য দুটি যুক্তি লাগে, একটি নয়: int compare(T o1, T o2)। এখানে এটি কীভাবে কাজ করে:"

উদাহরণ
public class Woman
{
public int age;
public int childrenCount;
public int weight;
public int height;
public String name;

public Woman(int age) {
this.age = age;
}
}
এটি কীভাবে ব্যবহার করা যেতে পারে তার একটি উদাহরণ:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Comparator<Woman> compareByHeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.height - o2.height;
}
};

Collections.sort(women, compareByHeight);
}

"তুলনাকারী ইন্টারফেস তুলনা করা বস্তুর ক্লাসের ভিতরে বস্তুর তুলনা যুক্তি লুকিয়ে রাখে না। পরিবর্তে, এটি একটি পৃথক শ্রেণীতে প্রয়োগ করা হয়।"

"সুতরাং, আমি তুলনাকারী ইন্টারফেস বাস্তবায়নের জন্য বেশ কয়েকটি ক্লাস তৈরি করতে পারি এবং তাদের প্রত্যেকের আলাদা আলাদা বৈশিষ্ট্যের তুলনা করতে পারি? একটিতে ওজন, অন্যটিতে বয়স এবং তৃতীয়টিতে উচ্চতা?"

"হ্যাঁ, এটা খুব সহজ এবং সুবিধাজনক।"

"আমরা শুধু Collections.sort পদ্ধতিকে কল করি, বস্তুর একটি তালিকা এবং অন্য একটি বিশেষ বস্তুকে দ্বিতীয় আর্গুমেন্ট হিসাবে পাস করে, যা তুলনাকারী ইন্টারফেস প্রয়োগ করে এবং সাজানোর প্রক্রিয়ায় বস্তুর জোড়ার সঠিকভাবে তুলনা করতে বলে।"

"হুম। আমি মনে করি আমি সবকিছু বুঝতে পেরেছি। আমাকে একবার চেষ্টা করতে দিন। বলুন যে আমার ব্যবহারকারীদের ওজন অনুসারে সাজাতে হবে। এটি এরকম কিছু হবে:"

ওজন অনুসারে ব্যবহারকারীদের সাজানোর উদাহরণ:
Comparator<Woman> compareByWeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.weight - o2.weight;
}
};

Collections.sort(women, compareByWeight);

"হ্যাঁ অবশ্যই."

"দারুণ। কিন্তু আমি যদি বিপরীত ক্রমে সাজাতে চাই?"

"এটি সম্পর্কে চিন্তা করুন. উত্তর খুব সহজ!"

"আমি এটা পেয়েছি! এই মত:"

ক্রমবর্ধমান ক্রমে সাজানো:
return o1.weight - o2.weight;
ক্রমহ্রাসমান ক্রমে সাজানো:
return o2.weight – o1.weight;

"ঠিক আছে। ভালো হয়েছে।"

"এবং আমি যদি পদবি অনুসারে সাজাতে চাই? আমি কীভাবে স্ট্রিংগুলি সাজাতে পারি, বিলাবো?"

"স্ট্রিং ক্লাসটি ইতিমধ্যে compareTo পদ্ধতি প্রয়োগ করে। আপনাকে শুধু এটি কল করতে হবে:"

নাম অনুসারে ব্যবহারকারীদের সাজানোর উদাহরণ:
Comparator<Woman> compareByName = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.name.compareTo(o2.name);
}
};

Collections.sort(women, compareByName);

"এটি একটি দুর্দান্ত পাঠ ছিল, বিলাবো। আপনাকে অনেক ধন্যবাদ।"

"এবং তোমাকে ধন্যবাদ, আমার বন্ধু!"