অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) লাইব্রেরিতে ComparatorUtils একটি ইউটিলিটি ক্লাস যা জাভার Comparator ইন্টারফেসকে আরও কার্যকরভাবে ব্যবহারের জন্য উন্নত ফিচার সরবরাহ করে। এটি বিভিন্ন কম্পারেটর তৈরিতে সাহায্য করে এবং জটিল অবজেক্ট কম্পারিজন সহজ করে।
ComparatorUtils এর বৈশিষ্ট্য
- Custom Comparator তৈরি করা সহজ:
একাধিক শর্তের উপর ভিত্তি করে কাস্টম কম্পারেটর তৈরি করা যায়। - ডিফল্ট ভ্যালু হ্যান্ডলিং:
ComparatorUtils.nullHighComparator()এবংComparatorUtils.nullLowComparator()ব্যবহার করেnullভ্যালুগুলো সহজে পরিচালনা করা যায়। - চেইনিং সাপোর্ট:
ComparatorUtils.chainedComparator()ব্যবহার করে একাধিক কম্পারেটর একত্রিত করা যায়।
ComparatorUtils ব্যবহার উদাহরণ
১. Null-Safe Comparator
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class NullSafeComparatorExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", null, "Bob", "Charlie");
// Null-safe comparator তৈরি (null values will appear last)
names.sort(ComparatorUtils.nullHighComparator(String::compareTo));
System.out.println("Sorted List: " + names);
}
}
আউটপুট:
Sorted List: [Alice, Bob, Charlie, null]
২. Multiple Conditions ব্যবহার
import org.apache.commons.collections4.ComparatorUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ChainedComparatorExample {
public static void main(String[] args) {
class Employee {
String name;
int age;
Employee(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
List<Employee> employees = new ArrayList<>();
employees.add(new Employee("Alice", 30));
employees.add(new Employee("Bob", 25));
employees.add(new Employee("Alice", 25));
employees.add(new Employee("Charlie", 35));
// চেইনড কম্পারেটর তৈরি
Comparator<Employee> comparator = ComparatorUtils.chainedComparator(
Comparator.comparing(employee -> employee.name), // প্রথমে নাম অনুযায়ী
Comparator.comparingInt(employee -> employee.age) // তারপর বয়স অনুযায়ী
);
Collections.sort(employees, comparator);
System.out.println("Sorted Employees: " + employees);
}
}
আউটপুট:
Sorted Employees: [Alice (25), Alice (30), Bob (25), Charlie (35)]
৩. Custom Reverse Comparator
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ReverseComparatorExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 2, 9, 3);
// রিভার্স অর্ডারে সাজানোর জন্য কম্পারেটর
Collections.sort(numbers, ComparatorUtils.reversedComparator(Integer::compareTo));
System.out.println("Reverse Sorted List: " + numbers);
}
}
আউটপুট:
Reverse Sorted List: [9, 5, 3, 2]
Object Comparison
অবজেক্ট কম্পারিজন করার জন্য অ্যাপাচি কমন্স কালেকশনস ComparatorUtils-এর বিভিন্ন ফিচার সরবরাহ করে, যা বিশেষত জটিল অবজেক্টগুলোর ক্ষেত্রে কার্যকর।
অবজেক্ট কম্পারিজনের ধাপসমূহ:
- প্রথমিক প্রপার্টি অনুযায়ী তুলনা করা।
- দ্বিতীয়িক শর্ত যোগ করা (যদি প্রথমিক সমান হয়)।
nullভ্যালুর জন্য সঠিক হ্যান্ডলিং।
ComparatorUtils এর সুবিধা
- কোড সংক্ষিপ্ত করা: কম্পারেটর তৈরি করা সহজ হয়।
- ফ্লেক্সিবিলিটি: চেইনড এবং কাস্টম শর্ত যোগ করে অবজেক্ট তুলনার নিয়ন্ত্রণ বাড়ানো যায়।
nullহ্যান্ডলিং: ডেটা ত্রুটি এড়িয়েnullভ্যালুকে সঠিকভাবে সাজানো যায়।
সারাংশ
ComparatorUtils হল অ্যাপাচি কমন্স কালেকশনসের একটি শক্তিশালী ইউটিলিটি, যা জাভার Comparator-এর উপর ভিত্তি করে উন্নত এবং কার্যকর ফিচার সরবরাহ করে। এটি অবজেক্ট কম্পারিজন, কাস্টম শর্ত তৈরি, এবং null ভ্যালু পরিচালনা সহজতর করে।
ComparatorUtils হলো অ্যাপাচি কমন্স কালেকশনস লাইব্রেরির একটি ইউটিলিটি ক্লাস, যা Comparator (তুলনাকারী)-এর বিভিন্ন কার্যকর অপারেশন সরবরাহ করে। এটি জাভার বিল্ট-ইন Comparator-এর সীমাবদ্ধতা কাটিয়ে তুলনামূলকভাবে উন্নত ফিচার প্রদান করে।
ComparatorUtils এর প্রধান ফিচার
- Chain Comparators (চেইনিং করা): একাধিক কম্পারেটরকে একত্রে চেইন করা।
- Null Handling (নাল হ্যান্ডলিং): নাল মানের তুলনামূলক সাপোর্ট প্রদান করা।
- Reverse Comparator (উল্টো ক্রম): একটি Comparator-এর ক্রম উল্টে দেওয়া।
- Fixed Comparator (ফিক্সড অর্ডার): নির্দিষ্ট ক্রম সংরক্ষণ করা।
- Natural Order Comparator (প্রাকৃতিক ক্রম): একটি প্রাকৃতিক অর্ডার তৈরির জন্য সাপোর্ট।
ComparatorUtils ব্যবহার
উদাহরণ ১: প্রাকৃতিক ক্রম এবং উল্টো ক্রম
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class NaturalOrderExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
// প্রাকৃতিক ক্রম
Collections.sort(numbers, ComparatorUtils.naturalComparator());
System.out.println("Natural Order: " + numbers);
// উল্টো ক্রম
Collections.sort(numbers, ComparatorUtils.reversedComparator(ComparatorUtils.naturalComparator()));
System.out.println("Reverse Order: " + numbers);
}
}
আউটপুট:
Natural Order: [1, 2, 5, 8, 9]
Reverse Order: [9, 8, 5, 2, 1]
উদাহরণ ২: চেইন কম্পারেটর
Chain Comparator ব্যবহার করে একাধিক শর্তের ভিত্তিতে ডেটা সাজানো যায়।
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
class Employee {
String name;
int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public class ChainComparatorExample {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("John", 25),
new Employee("Alice", 30),
new Employee("Bob", 25),
new Employee("Eve", 35)
);
// প্রথমে বয়স অনুযায়ী, তারপর নাম অনুযায়ী সাজানো
Comparator<Employee> ageComparator = Comparator.comparingInt(e -> e.age);
Comparator<Employee> nameComparator = Comparator.comparing(e -> e.name);
Comparator<Employee> chainComparator = ComparatorUtils.chainedComparator(ageComparator, nameComparator);
employees.sort(chainComparator);
System.out.println("Sorted Employees: " + employees);
}
}
আউটপুট:
Sorted Employees: [Bob (25), John (25), Alice (30), Eve (35)]
উদাহরণ ৩: Null হ্যান্ডলিং
Null Handling Comparator দিয়ে নাল মানগুলো সাজানোর সময় কাস্টম অর্ডার সেট করা যায়।
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class NullHandlingExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", null, "Bob", "Eve", null);
// Null প্রথমে রাখে
Collections.sort(names, ComparatorUtils.nullLowComparator(Comparator.naturalOrder()));
System.out.println("Null Low Order: " + names);
// Null শেষে রাখে
Collections.sort(names, ComparatorUtils.nullHighComparator(Comparator.naturalOrder()));
System.out.println("Null High Order: " + names);
}
}
আউটপুট:
Null Low Order: [null, null, Alice, Bob, Eve]
Null High Order: [Alice, Bob, Eve, null, null]
উদাহরণ ৪: ফিক্সড অর্ডার Comparator
Fixed Order Comparator দিয়ে নির্দিষ্ট ক্রম অনুসারে ডেটা সাজানো যায়।
import org.apache.commons.collections4.ComparatorUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class FixedOrderExample {
public static void main(String[] args) {
List<String> items = Arrays.asList("Banana", "Apple", "Orange", "Grapes");
// নির্দিষ্ট ক্রম: Apple -> Orange -> Banana -> Grapes
ComparatorUtils.FixedOrderComparator<String> fixedOrder = new ComparatorUtils.FixedOrderComparator<>(
Arrays.asList("Apple", "Orange", "Banana", "Grapes")
);
Collections.sort(items, fixedOrder);
System.out.println("Fixed Order: " + items);
}
}
আউটপুট:
Fixed Order: [Apple, Orange, Banana, Grapes]
ComparatorUtils এর সুবিধা
- কোড সরলীকরণ: জটিল Comparator তৈরির প্রয়োজনীয়তা কমায়।
- রিইউজেবল: একবার তৈরি করা Comparator বিভিন্ন জায়গায় ব্যবহার করা যায়।
- Null Friendly: Null Handling এর মাধ্যমে ডেটা ম্যানিপুলেশন সহজ করে।
- চেইনিং সাপোর্ট: একাধিক Comparator এর যৌথ ব্যবহার সম্ভব।
সারাংশ
ComparatorUtils অ্যাপাচি কমন্স কালেকশনস লাইব্রেরির একটি কার্যকর ইউটিলিটি, যা জাভার ডেটা সাজানোর প্রক্রিয়াকে সহজতর এবং উন্নত করে। এটি চেইনিং, নাল হ্যান্ডলিং, এবং কাস্টম ক্রম তৈরির মতো কাজগুলোর জন্য আদর্শ সমাধান প্রদান করে।
অ্যাপাচি কমন্স কালেকশনস (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, এবং অন্যান্য কালেকশনে এই কাস্টম কম্প্যারেটরগুলি ব্যবহার করে আপনি ডেটার শুদ্ধতা, অর্ডার এবং কার্যকারিতা নিশ্চিত করতে পারেন।
Apache Commons Collections লাইব্রেরি Comparator সম্পর্কিত কিছু শক্তিশালী ক্লাস এবং ফাংশন সরবরাহ করে যা কোলেকশনগুলির মধ্যে উপাদান তুলনা এবং সাজানো (sorting) সহজ করে তোলে। এর মধ্যে দুটি গুরুত্বপূর্ণ ক্লাস হল ChainedComparator এবং ReverseComparator। এই ক্লাসগুলি Comparator ইন্টারফেসের মাধ্যমে কাস্টম অর্ডারিং এবং তুলনা কৌশল প্রয়োগ করতে সাহায্য করে।
এই নিবন্ধে, আমরা ChainedComparator এবং ReverseComparator এর কার্যকারিতা এবং তাদের ব্যবহার সম্পর্কে বিস্তারিত আলোচনা করব।
১. ChainedComparator কী?
ChainedComparator হল একটি Comparator যা একাধিক Comparator কে একত্রে ব্যবহার করে, অর্থাৎ এটি একাধিক তুলনা ফাংশন (comparators) কে শৃঙ্খলে যুক্ত করে। আপনি যখন একাধিক তুলনা ভিত্তিক সাজানোর প্রয়োজন অনুভব করেন, তখন ChainedComparator একটি কার্যকরী সমাধান। এটি একাধিক Comparator ব্যবহার করে প্রথমে একটি Comparator প্রয়োগ করে, এবং যদি দুটি উপাদান সমান হয়, তখন পরবর্তী Comparator প্রয়োগ করা হয়।
ChainedComparator ব্যবহার করার প্রধান সুবিধা:
- একাধিক Comparator কে একত্রে ব্যবহার করা।
- সাজানোর জন্য কাস্টম অর্ডারিং প্রয়োগ করা, যেখানে প্রথম Comparator যদি দুটি উপাদান সমান না হতে পারে, তখন দ্বিতীয় Comparator প্রয়োগ হবে।
উদাহরণ: ChainedComparator
import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.collections4.ComparatorUtils.ChainedComparator;
import java.util.*;
public class ChainedComparatorExample {
public static void main(String[] args) {
// Create a list of objects to be sorted
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
list.add("blueberry");
// Create comparators
Comparator<String> lengthComparator = Comparator.comparingInt(String::length);
Comparator<String> alphabetComparator = Comparator.naturalOrder();
// Chain comparators
ChainedComparator<String> chainedComparator = new ChainedComparator<>(lengthComparator, alphabetComparator);
// Sort using ChainedComparator
Collections.sort(list, chainedComparator);
// Print sorted list
System.out.println(list);
}
}
এখানে:
lengthComparatorপ্রথমে String এর দৈর্ঘ্য অনুসারে তুলনা করবে।alphabetComparatorদ্বিতীয় পর্যায়ে আলফাবেটিকাল (অক্ষরগত) তুলনা করবে যদি প্রথম Comparator সমান হয়।
আউটপুট:
[apple, banana, cherry, blueberry]
এখানে প্রথমে শব্দগুলির দৈর্ঘ্য অনুযায়ী সাজানো হয়েছে, এবং যদি দৈর্ঘ্য সমান হয়, তবে আলফাবেটিক সাজানো হয়েছে।
২. ReverseComparator কী?
ReverseComparator হল একটি Comparator যা একটি বিদ্যমান Comparator কে রিভার্স করে (reverse)। এর মানে হল যে, যদি আপনার একটি সাধারণ Comparator থাকে যা ছোট থেকে বড় (ascending order) সাজানো থাকে, তবে ReverseComparator তাকে বড় থেকে ছোট (descending order) সাজানোতে পরিণত করবে। এটি ব্যবহার করে আপনি সহজেই কোন Comparator কে উল্টো সাজানোর জন্য ব্যবহার করতে পারেন।
ReverseComparator ব্যবহার করার প্রধান সুবিধা:
- বিদ্যমান Comparator কে বিপরীত (reverse) সাজানোর জন্য রূপান্তর করা।
উদাহরণ: ReverseComparator
import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.collections4.ComparatorUtils.ReverseComparator;
import java.util.*;
public class ReverseComparatorExample {
public static void main(String[] args) {
// Create a list of numbers to be sorted
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(4);
list.add(2);
// Create a comparator for natural order (ascending)
Comparator<Integer> ascendingComparator = Comparator.naturalOrder();
// Create a ReverseComparator
ReverseComparator<Integer> reverseComparator = new ReverseComparator<>(ascendingComparator);
// Sort using ReverseComparator
Collections.sort(list, reverseComparator);
// Print sorted list
System.out.println(list);
}
}
এখানে:
ascendingComparatorএকটি Comparator যা ছোট থেকে বড় (ascending) সাজানোর জন্য ব্যবহৃত হয়।ReverseComparatorব্যবহার করে আমরা সেই ascendingComparator কে রিভার্স (descending) করে ফেলেছি।
আউটপুট:
[4, 3, 2, 1]
এখানে সংখ্যাগুলি বড় থেকে ছোট (descending) অর্ডারে সাজানো হয়েছে।
৩. ChainedComparator এবং ReverseComparator এর মধ্যে পার্থক্য
- ChainedComparator: একাধিক Comparator কে শৃঙ্খলে যুক্ত করে তুলনা করতে ব্যবহৃত হয়, যেখানে একটি Comparator যদি দুটি উপাদানকে সমান মনে করে, তখন পরবর্তী Comparator প্রয়োগ করা হয়। এটি একাধিক তুলনা কৌশল প্রয়োগ করে।
- ReverseComparator: এটি একটি বিদ্যমান Comparator কে রিভার্স (reverse) করে, যাতে সাধারণ সাজানো (ascending order) পরিবর্তন হয়ে বিপরীত (descending order) হয়ে যায়।
৪. ChainedComparator এবং ReverseComparator এর ব্যবহার কেস
- ChainedComparator: যখন আপনি একাধিক তুলনা (comparisons) প্রয়োগ করতে চান, যেমন প্রথমে একটি শর্তের উপর সাজানো এবং তারপর অন্য একটি শর্তের উপর সাজানো।
- ReverseComparator: যখন আপনি একটি বিদ্যমান Comparator কে শুধুমাত্র উল্টো (reverse) করতে চান, যেমন যেটি সাধারণত ascending order-এ সাজানো থাকে, তাকে descending order-এ সাজাতে চান।
সারাংশ
ChainedComparator এবং ReverseComparator দুটি শক্তিশালী Comparator ক্লাস যা Apache Commons Collections লাইব্রেরির অংশ। ChainedComparator একাধিক Comparator কে একত্রে ব্যবহার করে সাজানো করতে সহায়তা করে, যেখানে ReverseComparator একটি বিদ্যমান Comparator কে রিভার্স করে সাজানোর জন্য ব্যবহৃত হয়। এই দুটি কৌশল Comparator-এর আচরণ কাস্টমাইজ করতে এবং সাজানোর কৌশল উন্নত করতে সহায়ক, যা আপনাকে আরও নমনীয় এবং কার্যকরী সাজানো এবং তুলনা করতে সাহায্য করে।
Apache Commons Collections লাইব্রেরির FixedOrderComparator একটি শক্তিশালী কম্প্যারেটর যা ডেটার উপাদানগুলির একটি নির্দিষ্ট অর্ডারে তুলনা করার জন্য ব্যবহৃত হয়। এটি একটি Comparator ইন্টারফেস বাস্তবায়ন করে, যা একটি List বা Set এর উপাদানগুলি একটি নির্দিষ্ট ক্রমে সাজাতে সাহায্য করে, সাধারণত আপনি যে ক্রমে চান বা যেভাবে উপাদানগুলি সাজাতে চান তা মেনে।
এটি বিশেষভাবে উপকারী যখন আপনাকে একটি predefined order অনুসারে এলিমেন্টগুলিকে সাজাতে হবে, যেমন একটি List বা Set এর উপাদানগুলিকে কোনো নির্দিষ্ট ক্রমে সাজানো।
১. FixedOrderComparator এর বৈশিষ্ট্য
FixedOrderComparator মূলত নিম্নলিখিত বৈশিষ্ট্যগুলির জন্য ব্যবহৃত হয়:
- একটি List বা Set এর উপাদানগুলি fixed (নির্দিষ্ট) ক্রমে সাজানোর জন্য।
- ক্রম অনুযায়ী উপাদানগুলোকে prioritize বা rank করার জন্য।
- যখন আপনি একটি নির্দিষ্ট ক্রমে sorting করতে চান, তবে এটি বিশেষভাবে সহায়ক।
২. FixedOrderComparator তৈরি করা
FixedOrderComparator এর উদাহরণ দেখলে সহজে বুঝা যাবে কিভাবে এটি কাজ করে। এটি একটি List বা Set এর উপাদানগুলিকে একটি নির্দিষ্ট অর্ডারে সাজাতে সাহায্য করে।
উদাহরণ: FixedOrderComparator এর ব্যবহার
ধরা যাক, আপনার কাছে কয়েকটি স্ট্রিং উপাদান আছে, এবং আপনি চান যে সেগুলো একটি নির্দিষ্ট অর্ডারে সাজানো হোক। আপনি FixedOrderComparator ব্যবহার করে এই অর্ডারটি সুনিশ্চিত করতে পারেন।
import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.collections4.comparators.FixedOrderComparator;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class FixedOrderComparatorExample {
public static void main(String[] args) {
// Create a list of strings
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date");
// Define the fixed order of the elements
List<String> order = Arrays.asList("banana", "apple", "cherry", "date");
// Create the FixedOrderComparator using the predefined order
FixedOrderComparator<String> comparator = new FixedOrderComparator<>(order);
// Sort the fruits list using the FixedOrderComparator
Collections.sort(fruits, comparator);
// Print the sorted list
System.out.println(fruits); // Output: [banana, apple, cherry, date]
}
}
এখানে:
- একটি List তৈরি করা হয়েছে যা কিছু ফ্রুট নাম ধারণ করছে:
"apple","banana","cherry","date". - একটি অন্য List তৈরি করা হয়েছে যেখানে আপনি predefined order নির্ধারণ করেছেন:
"banana","apple","cherry","date". - তারপর, FixedOrderComparator ব্যবহার করে আমরা এই উল্লিখিত ক্রমে fruits তালিকাটি সাজিয়েছি।
আউটপুট:
[banana, apple, cherry, date]
এটি দেখাচ্ছে কিভাবে একটি predefined order ব্যবহার করে তালিকাটি সাজানো হলো, যা FixedOrderComparator এর মাধ্যমে সম্ভব হয়েছে।
৩. FixedOrderComparator এর অন্যান্য ব্যবহার
- Set এ নির্দিষ্ট অর্ডারে উপাদান রাখা: আপনি যদি একটি Set এর উপাদানগুলিকে নির্দিষ্ট অর্ডারে রাখতে চান, তবে FixedOrderComparator ব্যবহার করতে পারেন। তবে, মনে রাখবেন যে, Set এ সাধারণত duplicates থাকতে পারে না, তাই এই ক্ষেত্রে List ব্যবহার বেশি উপকারী।
- Custom Sort Order: যদি আপনার কাছে কিছু ডেটা থাকে এবং আপনি সেই ডেটার একটি নির্দিষ্ট অর্ডার চান, আপনি FixedOrderComparator ব্যবহার করে খুব সহজেই সেই ডেটা সাজাতে পারেন।
- Sorting Complex Objects: আপনি যদি একটি complex object (যেমন, Custom Class) এর ওপর FixedOrderComparator প্রয়োগ করতে চান, তবে সেই ক্লাসের মধ্যে উপাদানগুলির অর্ডার সংজ্ঞায়িত করে তার উপর Comparator তৈরি করতে পারেন।
উদাহরণ: FixedOrderComparator with Custom Objects
ধরা যাক, আপনি একটি Person ক্লাস তৈরি করেছেন এবং তাদের নামের উপর নির্দিষ্ট অর্ডার দিতে চান।
import org.apache.commons.collections4.comparators.FixedOrderComparator;
import java.util.Arrays;
import java.util.List;
public class FixedOrderComparatorWithCustomObjects {
static class Person {
String name;
Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
public static void main(String[] args) {
List<Person> people = Arrays.asList(new Person("John"), new Person("Alice"), new Person("Bob"));
// Define the fixed order
List<String> order = Arrays.asList("Alice", "Bob", "John");
// Create the FixedOrderComparator using the predefined order
FixedOrderComparator<Person> comparator = new FixedOrderComparator<>(order);
// Sort the list using the FixedOrderComparator
people.sort((p1, p2) -> comparator.compare(p1.getName(), p2.getName()));
// Print the sorted list
System.out.println(people); // Output: [Alice, Bob, John]
}
}
এখানে:
- Person ক্লাস তৈরি করা হয়েছে, যেখানে name নামে একটি প্রপার্টি রয়েছে।
- FixedOrderComparator ব্যবহার করে, people লিস্টের Person অবজেক্টগুলিকে name এর ভিত্তিতে নির্দিষ্ট অর্ডারে সাজানো হয়েছে।
আউটপুট:
[Alice, Bob, John]
এটি দেখাচ্ছে কিভাবে FixedOrderComparator ব্যবহার করে একটি custom object এর উপাদানগুলিকে নির্দিষ্ট অর্ডারে সাজানো যেতে পারে।
৪. FixedOrderComparator এর সুবিধা এবং ব্যবহার ক্ষেত্র
- কাস্টম অর্ডার প্রয়োগ: যখন আপনি চান যে কোনো List বা Set এর উপাদানগুলো একটি নির্দিষ্ট অর্ডারে সাজানো হোক, তখন এটি খুবই কার্যকরী।
- ফ্লেক্সিবল কম্প্যারিজন: FixedOrderComparator আপনাকে যেকোনো ধরনের custom order প্রদান করার সুযোগ দেয়, যেমন নামের অর্ডার, প্রাধান্য অনুযায়ী সাজানো ইত্যাদি।
- ডেটা ম্যানিপুলেশন: আপনি FixedOrderComparator ব্যবহার করে sorting, filtering, এবং prioritization এর মতো অপারেশন করতে পারেন।
সারাংশ
FixedOrderComparator হল Apache Commons Collections লাইব্রেরির একটি গুরুত্বপূর্ণ ক্লাস যা একটি predefined order অনুযায়ী Collections এর উপাদানগুলোকে সাজানোর জন্য ব্যবহৃত হয়। এটি Comparator ইন্টারফেসের একটি বাস্তবায়ন যা List বা Set এর উপাদানগুলোকে নির্দিষ্ট ক্রমে সাজাতে সাহায্য করে। এটি খুবই উপকারী যখন আপনি চান যে ডেটার উপাদানগুলো একটি নির্দিষ্ট অর্ডারে সাজানো হোক, যেমন priority, ranking, বা natural ordering অনুসারে।
Read more