অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) লাইব্রেরি Java ডেভেলপারদের জন্য শক্তিশালী ডেটা স্ট্রাকচার এবং ইউটিলিটি ক্লাস সরবরাহ করে, যা ডেটা ম্যানিপুলেশন এবং সংগ্রহ ব্যবস্থাপনা সহজ করে তোলে। এর মধ্যে একটি গুরুত্বপূর্ণ ফিচার হল Custom Comparators, যা আপনাকে ডেটা সেটের উপাদানগুলিকে আপনার নিজস্ব কাস্টম লজিক বা শর্ত অনুযায়ী তুলনা করতে এবং সাজাতে সাহায্য করে।
Comparator একটি ইন্টারফেস যা দুটি অবজেক্টের তুলনা করে, এবং সেই তুলনা অনুযায়ী তাদের অর্ডার নির্ধারণ করে। এটি সাধারণত সজ্জিতকরণ (sorting) বা অনুসন্ধান (searching) প্রক্রিয়ায় ব্যবহৃত হয়।
এই টিউটোরিয়ালে, আমরা আলোচনা করব কিভাবে অ্যাপাচি কমন্স কালেকশনসে Custom Comparators তৈরি করতে হয় এবং এগুলিকে SortedBag, List বা অন্যান্য কালেকশনে ব্যবহার করা যায়।
১. Comparator ইন্টারফেসের ভূমিকা
Comparator ইন্টারফেস Java এর স্ট্যান্ডার্ড API তে একটি ইনটারফেস যা দুটি অবজেক্টের তুলনা করতে ব্যবহৃত হয়। এটি একটি compare() মেথড প্রদান করে, যা দুটি অবজেক্ট গ্রহণ করে এবং একটি পূর্ণসংখ্যা রিটার্ন করে:
- যদি প্রথম অবজেক্টটি ছোট হয়, তাহলে এটি একটি নেতিবাচক মান রিটার্ন করে।
- যদি প্রথম অবজেক্টটি বড় হয়, তাহলে এটি একটি ধনাত্মক মান রিটার্ন করে।
- যদি উভয় অবজেক্ট সমান হয়, তাহলে এটি শূন্য (0) রিটার্ন করে।
Custom Comparators ব্যবহৃত হয় যখন আপনি আপনার নিজস্ব তুলনা শর্ত বা কাস্টম সজ্জিতকরণ লজিক প্রয়োগ করতে চান।
২. Custom Comparator তৈরি করা
অ্যাপাচি কমন্স কালেকশনস লাইব্রেরি ব্যবহার করে Custom Comparator তৈরি করার জন্য প্রথমে একটি Comparator ক্লাস তৈরি করতে হয় যা নির্দিষ্ট শর্ত অনুযায়ী দুটি অবজেক্ট তুলনা করবে।
উদাহরণ: Custom Comparator তৈরি করা
ধরা যাক, আমরা একটি Person অবজেক্ট তৈরি করেছি এবং চাইছি যে আমরা নামের অর্ডার অনুযায়ী এবং যদি নাম একই হয় তবে বয়সের অর্ডার অনুযায়ী সজ্জিত করতে।
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Comparator;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
public class CustomComparatorExample {
public static void main(String[] args) {
// Create a comparator to compare by name and age
Comparator<Person> nameThenAgeComparator = Comparator
.comparing(Person::getName)
.thenComparing(Person::getAge);
// Create some Person objects
Person person1 = new Person("John", 25);
Person person2 = new Person("Alice", 30);
Person person3 = new Person("John", 20);
// Compare persons using custom comparator
System.out.println(nameThenAgeComparator.compare(person1, person2)); // Output: positive number (John > Alice)
System.out.println(nameThenAgeComparator.compare(person1, person3)); // Output: positive number (John 25 > John 20)
}
}
এখানে:
Comparator.comparing(Person::getName)ব্যবহার করে প্রথমেnameঅনুযায়ী তুলনা করা হয়েছে।thenComparing(Person::getAge)ব্যবহার করে যদিnameসমান হয়, তাহলেageঅনুসারে দ্বিতীয় তুলনা করা হয়েছে।
৩. ComparatorUtils ব্যবহার করা
অ্যাপাচি কমন্স কালেকশনস লাইব্রেরি ComparatorUtils ক্লাস প্রদান করে, যা কিছু সাধারণ তুলনা কার্যাবলী সরবরাহ করে। এটি আপনি যদি সাধারণ তুলনা শর্ত তৈরি করতে চান, যেমন বড়/ছোট, সমান ইত্যাদি, তবে খুবই কার্যকরী।
উদাহরণ: ComparatorUtils ব্যবহার করা
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Comparator;
public class ComparatorUtilsExample {
public static void main(String[] args) {
// Comparator to compare two integers
Comparator<Integer> comparator = ComparatorUtils.nullHighComparator(Comparator.naturalOrder());
// Compare integers using the comparator
System.out.println(comparator.compare(10, 20)); // Output: -1 (10 < 20)
System.out.println(comparator.compare(20, 10)); // Output: 1 (20 > 10)
System.out.println(comparator.compare(null, 10)); // Output: 1 (null is considered larger)
}
}
এখানে:
ComparatorUtils.nullHighComparator()ব্যবহার করা হয়েছে যাতেnullমান তুলনা করার সময় এটি সঠিকভাবে কাজ করে (অথবা আপনি চাইলেnullLowComparator()ব্যবহার করতে পারেন)।Comparator.naturalOrder()স্বাভাবিক অর্ডারে তুলনা করার জন্য ব্যবহৃত হয়েছে।
৪. SortedBag এ Custom Comparator ব্যবহার করা
SortedBag হল একটি বিশেষ ধরনের Bag যা উপাদানগুলিকে সঠিক ক্রমে সজ্জিত রাখে। আপনি Custom Comparator ব্যবহার করে SortedBag এ সজ্জিত করতে পারেন।
উদাহরণ: SortedBag এ Custom Comparator ব্যবহার
import org.apache.commons.collections4.SortedBag;
import org.apache.commons.collections4.bag.TreeBag;
import java.util.Comparator;
public class SortedBagExample {
public static void main(String[] args) {
// Create a custom comparator that sorts strings in reverse order
Comparator<String> reverseComparator = Comparator.reverseOrder();
// Create a SortedBag using the custom comparator
SortedBag<String> sortedBag = new TreeBag<>(reverseComparator);
// Add items to the SortedBag
sortedBag.add("apple");
sortedBag.add("banana");
sortedBag.add("cherry");
// Print the SortedBag
System.out.println("Sorted Bag contents: " + sortedBag); // Output: [cherry, banana, apple]
}
}
এখানে:
Comparator.reverseOrder()ব্যবহার করে স্ট্রিংগুলিকে রিভার্স অর্ডারে সাজানো হয়েছে।TreeBagব্যবহার করা হয়েছে যা একটিSortedBagইমপ্লিমেন্টেশন, যেখানেreverseComparatorব্যবহার করে সাজানো হয়েছে।
৫. Comparator এর বিভিন্ন ধরনের ব্যবহার
- শ্রেণীভিত্তিক তুলনা (Class-based comparison): আপনি যদি শ্রেণীভিত্তিক আইটেমগুলির তুলনা করতে চান, যেমন বয়স, নাম, পরিসংখ্যান ইত্যাদি, তবে আপনি
Comparatorইন্টারফেস ব্যবহার করতে পারেন। - একাধিক শর্তে তুলনা (Chained Comparisons): একাধিক শর্ত (যেমন নাম এবং বয়স) দিয়ে তুলনা করতে পারেন, এবং প্রয়োজনে শর্তগুলিকে চেইন করতে পারেন।
- Null মানের তুলনা:
ComparatorUtils.nullHighComparator()এবংComparatorUtils.nullLowComparator()ব্যবহার করে আপনিnullমানগুলির জন্য বিশেষ আচরণ নির্ধারণ করতে পারেন।
সারাংশ
অ্যাপাচি কমন্স কালেকশনস লাইব্রেরির Custom Comparators আপনাকে ডেটা সেটের উপাদানগুলিকে আপনার নিজস্ব শর্ত বা কাস্টম লজিক অনুযায়ী তুলনা এবং সজ্জিত করতে সহায়তা করে। Comparator ইন্টারফেস ব্যবহার করে আপনি আপনার কাঙ্খিত তুলনা বা সজ্জিতকরণ লজিক প্রয়োগ করতে পারেন। SortedBag, List, এবং অন্যান্য কালেকশনে এই কাস্টম কম্প্যারেটরগুলি ব্যবহার করে আপনি ডেটার শুদ্ধতা, অর্ডার এবং কার্যকারিতা নিশ্চিত করতে পারেন।
Read more