Guava লাইব্রেরির Range এবং RangeSet কনসেপ্টগুলি এমন ডেটা কাঠামো যা একটি নির্দিষ্ট পরিসরের মধ্যে ডেটা রাখার এবং পরিচালনা করার জন্য ব্যবহৃত হয়। এগুলি সাধারণত সংখ্যার পরিসর বা মানের সন্নিবেশগুলির উপর কাজ করে, যা সহজে চেক করা, সংরক্ষণ করা এবং বিশ্লেষণ করা যায়।
Range এর ধারণা
Guava এর Range হলো এমন একটি ডেটা কাঠামো যা একটি নির্দিষ্ট পরিসরের মধ্যে উপাদান ধারণ করে। এটি একটি সীমার মধ্যে থাকা মানগুলিকে প্রতিনিধিত্ব করে, যেমন 1 থেকে 10 পর্যন্ত বা A থেকে Z পর্যন্ত। Range ক্লাসটি বাউন্ডেড (bounded) মানগুলির মধ্যে সীমাবদ্ধ থেকে চেক এবং পরিসর তৈরি করতে ব্যবহৃত হয়।
Guava এর Range ক্লাসটি তিন ধরনের রেঞ্জ প্রতিনিধিত্ব করতে পারে:
- Closed Range (inclusive): পরিসরের উভয় প্রান্ত অন্তর্ভুক্ত থাকে (যেমন [1, 10])।
- Open Range (exclusive): পরিসরের উভয় প্রান্ত অন্তর্ভুক্ত থাকে না (যেমন (1, 10))।
- Half-Open Range (inclusive start, exclusive end): একটি প্রান্ত অন্তর্ভুক্ত থাকে এবং অপরটি অন্তর্ভুক্ত থাকে না (যেমন [1, 10))।
Range এর উদাহরণ
Closed Range
import com.google.common.collect.Range;
public class RangeExample {
public static void main(String[] args) {
// Create a closed range [1, 10]
Range<Integer> range = Range.closed(1, 10);
System.out.println(range.contains(5)); // true
System.out.println(range.contains(10)); // true
System.out.println(range.contains(11)); // false
}
}
Open Range
import com.google.common.collect.Range;
public class OpenRangeExample {
public static void main(String[] args) {
// Create an open range (1, 10)
Range<Integer> range = Range.open(1, 10);
System.out.println(range.contains(5)); // true
System.out.println(range.contains(1)); // false
System.out.println(range.contains(10)); // false
}
}
Half-Open Range
import com.google.common.collect.Range;
public class HalfOpenRangeExample {
public static void main(String[] args) {
// Create a half-open range [1, 10)
Range<Integer> range = Range.closedOpen(1, 10);
System.out.println(range.contains(5)); // true
System.out.println(range.contains(1)); // true
System.out.println(range.contains(10)); // false
}
}
Rangeset এর ধারণা
RangeSet হলো Guava লাইব্রেরির একটি ডেটা কাঠামো যা একাধিক Range ধারণ করে এবং তাদের উপর কাজ করতে পারে। এটি একাধিক পরিসরের মধ্যে কাজ করতে সহায়তা করে, যেমন একাধিক নির্দিষ্ট সংখ্যা বা পরিসরের একটি সেট। এটি বিশেষভাবে উপকারী যখন অনেকগুলি পরিসর একসাথে সংরক্ষণ করতে হয় এবং সেই পরিসরের মধ্যে বৈধ উপাদানগুলির উপর ক্রিয়া করতে হয়।
RangeSet এর উদাহরণ
RangeSet তৈরি এবং ব্যবহৃত
import com.google.common.collect.Range;
import com.google.common.collect.TreeRangeSet;
public class RangeSetExample {
public static void main(String[] args) {
// Create a RangeSet
TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
// Add ranges to the RangeSet
rangeSet.add(Range.closed(1, 10));
rangeSet.add(Range.closed(20, 30));
System.out.println(rangeSet.contains(5)); // true
System.out.println(rangeSet.contains(15)); // false
System.out.println(rangeSet.contains(25)); // true
// View all the ranges
System.out.println(rangeSet.asRanges()); // [(1‥10), (20‥30)]
}
}
Rangeset এর মধ্যে পরিসর সমন্বয়
RangeSet-এ আপনি বিভিন্ন রেঞ্জ যোগ, মুছতে, বা অনুসন্ধান করতে পারেন। যদি দুটি পরিসরের মধ্যে কোনো ওভারল্যাপ থাকে, তবে RangeSet এটি স্বয়ংক্রিয়ভাবে একত্রিত (merge) করে নেবে।
import com.google.common.collect.Range;
import com.google.common.collect.TreeRangeSet;
public class RangeSetMergeExample {
public static void main(String[] args) {
// Create a RangeSet
TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
// Add ranges to the RangeSet
rangeSet.add(Range.closed(1, 5));
rangeSet.add(Range.closed(4, 10));
// View merged ranges
System.out.println(rangeSet.asRanges()); // [(1‥10)]
}
}
Range এবং RangeSet এর সুবিধা
- পরিসরের মধ্যে কাজ করা সহজ: Range এবং RangeSet ব্যবহার করে সহজে পরিসরের মধ্যে উপাদান চেক করা যায়।
- Multiple Ranges Handling: RangeSet একাধিক পরিসর পরিচালনা করতে সক্ষম, যেমন একটি সেটের মধ্যে বিভিন্ন পরিসর থাকা।
- Efficient Operations: একাধিক পরিসরের মধ্যে অর্ন্তগত উপাদানগুলো দ্রুত চেক বা ম্যানিপুলেট করা সম্ভব।
Range এবং RangeSet এর সীমাবদ্ধতা
- Memory Consumption: যদি অনেক বড় পরিসর সংরক্ষণ করতে হয়, তবে মেমরি ব্যবহারে সমস্যা হতে পারে।
- Complexity in Handling Overlapping Ranges: যখন দুটি পরিসর একে অপরকে অতিক্রম করে, তখন সেগুলোকে সঠিকভাবে একত্রিত করা কিছুটা জটিল হতে পারে।
- Java 8+ Features Compatibility: Guava লাইব্রেরির এই বৈশিষ্ট্যগুলির সাথে Java 8 এর স্ট্যান্ডার্ড লাইব্রেরি ফিচারগুলোর কিছু ক্ষেত্রে সামঞ্জস্য সমস্যা হতে পারে।
Guava লাইব্রেরির Range এবং RangeSet খুবই কার্যকরী ডেটা কাঠামো, যা বিশেষত পরিসরের মধ্যে ডেটা পরিচালনা এবং বিশ্লেষণে সাহায্য করে। এটি সংখ্যা এবং অন্যান্য মানের পরিসরের মধ্যে কাজ করার জন্য একটি শক্তিশালী টুল।
Guava লাইব্রেরি Range ক্লাসটি Java Collections Framework এর বাইরে একটি শক্তিশালী এবং ব্যবহারযোগ্য ক্লাস। এটি রেঞ্জ বা সীমা ব্যবস্থাপনার জন্য ব্যবহৃত হয়, বিশেষত যখন আপনাকে একটি সংখ্যা বা ডেটা সেটের মধ্যে সীমা নির্ধারণ করতে হয়। Range আপনাকে minimum, maximum, এবং inclusive/exclusive bounds সম্পর্কে কার্যকরী উপায়ে কাজ করার সুবিধা দেয়।
Range কী?
Guava এর Range একটি immutable ডেটা স্ট্রাকচার, যা একটি নির্দিষ্ট পরিসরের মধ্যে মানগুলিকে inclusive (শামিল) বা exclusive (বহিঃস্ত) হ্যান্ডল করে। এটি একটি মানের সীমানা বা রেঞ্জ তৈরি করতে ব্যবহৃত হয়, এবং আপনাকে সেই রেঞ্জের মধ্যে বিভিন্ন অপারেশন যেমন checking containment, intersection, এবং clipping করতে দেয়।
Range ক্লাসের মৌলিক বৈশিষ্ট্য
- Inclusive/Exclusive Bounds:
Rangeব্যবহার করে আপনি inclusive (অন্তর্ভুক্ত) বা exclusive (অন্তর্ভুক্ত নয়) সীমানা নির্ধারণ করতে পারেন।Range.closed(start, end): উভয় সীমানা অন্তর্ভুক্ত।Range.open(start, end): উভয় সীমানা বহিঃস্ত।Range.closedOpen(start, end): বাম সীমানা অন্তর্ভুক্ত, ডান সীমানা বহিঃস্ত।Range.openClosed(start, end): বাম সীমানা বহিঃস্ত, ডান সীমানা অন্তর্ভুক্ত।
- Bounded:
Rangeএকটি bounded (সীমাবদ্ধ) পরিসরের মধ্যে কাজ করে, যেমন গঠন করা একটি সংখ্যার সীমা। - Containment Checking: এটি সহজে চেক করতে সাহায্য করে যে একটি মান একটি নির্দিষ্ট রেঞ্জের মধ্যে পড়ে কিনা।
- Range Operations:
Rangeএর মাধ্যমে আপনি union, intersection, এবং difference অপারেশনগুলোও করতে পারেন।
Range এর তৈরি করার পদ্ধতি
১. Range.closed (inclusive bounds)
এটি এমন একটি রেঞ্জ তৈরি করে যা উভয় সীমানাকে অন্তর্ভুক্ত করে।
Range<Integer> range = Range.closed(1, 10);
System.out.println(range.contains(5)); // true
System.out.println(range.contains(1)); // true
System.out.println(range.contains(10)); // true
System.out.println(range.contains(11)); // false
২. Range.open (exclusive bounds)
এটি এমন একটি রেঞ্জ তৈরি করে যা উভয় সীমানাকে অন্তর্ভুক্ত নয়।
Range<Integer> range = Range.open(1, 10);
System.out.println(range.contains(5)); // true
System.out.println(range.contains(1)); // false
System.out.println(range.contains(10)); // false
৩. Range.closedOpen (left inclusive, right exclusive)
এটি এমন একটি রেঞ্জ তৈরি করে যা বাম সীমানাকে অন্তর্ভুক্ত এবং ডান সীমানাকে বহিঃস্ত রাখে।
Range<Integer> range = Range.closedOpen(1, 10);
System.out.println(range.contains(1)); // true
System.out.println(range.contains(10)); // false
৪. Range.openClosed (left exclusive, right inclusive)
এটি এমন একটি রেঞ্জ তৈরি করে যা বাম সীমানাকে বহিঃস্ত এবং ডান সীমানাকে অন্তর্ভুক্ত রাখে।
Range<Integer> range = Range.openClosed(1, 10);
System.out.println(range.contains(1)); // false
System.out.println(range.contains(10)); // true
Range এর অন্যান্য কার্যক্রম
Range.contains() মেথড
এই মেথডটি চেক করে যে একটি নির্দিষ্ট মান রেঞ্জের মধ্যে পড়ে কিনা।
Range<Integer> range = Range.closed(1, 10);
System.out.println(range.contains(5)); // true
System.out.println(range.contains(15)); // false
Range.encloses() মেথড
এই মেথডটি চেক করে যে একটি রেঞ্জ অন্য একটি রেঞ্জের মধ্যে অন্তর্ভুক্ত কিনা।
Range<Integer> range1 = Range.closed(1, 10);
Range<Integer> range2 = Range.closed(3, 8);
System.out.println(range1.encloses(range2)); // true
Range.intersection() মেথড
এটি দুটি রেঞ্জের intersection (অন্তঃস্থল) বের করে। এটি একটি নতুন রেঞ্জ তৈরি করে যেটি দুটি রেঞ্জের মিল।
Range<Integer> range1 = Range.closed(1, 10);
Range<Integer> range2 = Range.closed(5, 15);
Range<Integer> intersection = range1.intersection(range2);
System.out.println(intersection); // [5..10]
Range.span() মেথড
এটি একটি রেঞ্জের পুরো পরিসরের span বের করে, যা দুটি রেঞ্জের সর্বনিম্ন এবং সর্বোচ্চ সীমানাকে অন্তর্ভুক্ত করে।
Range<Integer> range1 = Range.closed(1, 5);
Range<Integer> range2 = Range.closed(10, 15);
Range<Integer> span = range1.span(range2);
System.out.println(span); // [1..15]
Range-এর প্রয়োগ
১. এটি ব্যবহার করা যায় যখন সীমাবদ্ধতা থাকতে হয়
যখন আপনাকে কোনো পরিসরে মান যাচাই করতে হয়, যেমন একটি পরীক্ষায় নম্বরের সীমানা, অ্যাকাউন্ট ব্যালেন্স, ইত্যাদি, সেখানে Range ব্যবহার করা যেতে পারে।
২. এটি কার্যকরী উপায়ে ডেটা ফিল্টার করার জন্য ব্যবহার করা যেতে পারে
ডেটাবেসের ফলাফল বা অন্যান্য ডেটাসেট ফিল্টার করতে Range ব্যবহার করা যায়।
Range<Integer> validRange = Range.closed(1, 100);
List<Integer> numbers = Arrays.asList(5, 20, 150, 50, 120);
List<Integer> filteredNumbers = numbers.stream()
.filter(validRange::contains)
.collect(Collectors.toList());
System.out.println(filteredNumbers); // [5, 20, 50]
৩. সম্মিলন এবং পার্থক্য বের করার জন্য ব্যবহার করা যায়
যখন দুটি রেঞ্জের সম্মিলন বা পার্থক্য বের করার প্রয়োজন হয়, সেখানে Range ক্লাসের intersection এবং span মেথড সহায়ক।
সারাংশ
Guava এর Range ক্লাস Java-তে range-based operations পরিচালনা করার জন্য একটি শক্তিশালী এবং সুবিধাজনক টুল। এটি আপনাকে সংখ্যার সীমানা নির্ধারণ এবং সেগুলির মধ্যে কার্যকরী অপারেশন যেমন containment, intersection, span, এবং enclosure করতে দেয়। Range ক্লাস ব্যবহার করে আপনি Java প্রোগ্রামে functional programming ধারণাকে আরও সহজভাবে বাস্তবায়ন করতে পারেন।
গুয়াভা (Guava) লাইব্রেরি Java-তে Range এর ধারণাকে সহজ এবং কার্যকরীভাবে পরিচালনা করার জন্য বিভিন্ন ইউটিলিটি প্রদান করে। Range বা সীমা (Range) হলো একটি নির্দিষ্ট শুরু এবং শেষের মধ্যে সীমাবদ্ধ একটি পরিসর। Guava লাইব্রেরিতে Open, Closed, এবং Half-open রেঞ্জের ধারণাগুলি অত্যন্ত শক্তিশালী এবং কার্যকরীভাবে ব্যবহৃত হয়। এই ধারণাগুলির মাধ্যমে আমরা যে কোনো রেঞ্জের অন্তর্ভুক্তি বা নিষ্ক্রিয়তা সহজে নির্ধারণ করতে পারি, যেমন শুরু এবং শেষ সীমা অন্তর্ভুক্ত থাকবে কি না।
1. Closed Range (সীমাবদ্ধ)
Closed range একটি রেঞ্জ যেখানে শুরু এবং শেষ উভয়ই অন্তর্ভুক্ত থাকে। অর্থাৎ, এই রেঞ্জে শুরু এবং শেষের মানও গ্রহণযোগ্য। উদাহরণস্বরূপ, একটি রেঞ্জ [1, 5] শুরুতে ১ এবং শেষে ৫ অন্তর্ভুক্ত।
গুয়াভা লাইব্রেরিতে Range.closed() মেথডটি একটি closed range তৈরি করতে ব্যবহৃত হয়।
উদাহরণ:
import com.google.common.collect.Range;
public class RangeExample {
public static void main(String[] args) {
// Creating a closed range [1, 5]
Range<Integer> closedRange = Range.closed(1, 5);
// Checking if a value is within the range
System.out.println(closedRange.contains(1)); // true
System.out.println(closedRange.contains(5)); // true
System.out.println(closedRange.contains(3)); // true
System.out.println(closedRange.contains(6)); // false
}
}
এখানে, Range.closed(1, 5) একটি বন্ধ রেঞ্জ তৈরি করেছে, যেখানে ১ এবং ৫ উভয়ই অন্তর্ভুক্ত।
2. Open Range (খোলা)
Open range একটি রেঞ্জ যেখানে শুরু এবং শেষ উভয়ই অন্তর্ভুক্ত নয়। অর্থাৎ, শুরু এবং শেষের মানের বাইরে মানগুলোই রেঞ্জের মধ্যে পড়বে। উদাহরণস্বরূপ, একটি রেঞ্জ (1, 5) যেখানে ১ এবং ৫ অন্তর্ভুক্ত নয়, তবে ১ এর বেশি এবং ৫ এর কম মানগুলো অন্তর্ভুক্ত থাকবে।
গুয়াভা লাইব্রেরিতে Range.open() মেথডটি একটি open range তৈরি করতে ব্যবহৃত হয়।
উদাহরণ:
import com.google.common.collect.Range;
public class RangeExample {
public static void main(String[] args) {
// Creating an open range (1, 5)
Range<Integer> openRange = Range.open(1, 5);
// Checking if a value is within the range
System.out.println(openRange.contains(1)); // false
System.out.println(openRange.contains(5)); // false
System.out.println(openRange.contains(3)); // true
System.out.println(openRange.contains(6)); // false
}
}
এখানে, Range.open(1, 5) একটি খোলা রেঞ্জ তৈরি করেছে, যেখানে ১ এবং ৫ উভয়ই অন্তর্ভুক্ত নয়, কিন্তু ৩ অন্তর্ভুক্ত।
3. Half-open Range (অর্ধ-খোলা)
Half-open range একটি রেঞ্জ যেখানে শুরু অন্তর্ভুক্ত থাকে, কিন্তু শেষ অন্তর্ভুক্ত থাকে না। অর্থাৎ, রেঞ্জটি শুরু থেকে শেষের আগ পর্যন্ত মানগুলো গ্রহণ করবে, কিন্তু শেষের মানটি গ্রহণ করবে না। উদাহরণস্বরূপ, একটি রেঞ্জ [1, 5) যেখানে ১ অন্তর্ভুক্ত থাকবে কিন্তু ৫ থাকবে না।
গুয়াভা লাইব্রেরিতে Range.closedOpen() এবং Range.openClosed() মেথডগুলি অর্ধ-খোলা রেঞ্জ তৈরি করতে ব্যবহৃত হয়।
উদাহরণ:
import com.google.common.collect.Range;
public class RangeExample {
public static void main(String[] args) {
// Creating a half-open range [1, 5)
Range<Integer> halfOpenRange = Range.closedOpen(1, 5);
// Checking if a value is within the range
System.out.println(halfOpenRange.contains(1)); // true
System.out.println(halfOpenRange.contains(5)); // false
System.out.println(halfOpenRange.contains(3)); // true
System.out.println(halfOpenRange.contains(6)); // false
}
}
এখানে, Range.closedOpen(1, 5) একটি অর্ধ-খোলা রেঞ্জ তৈরি করেছে, যেখানে ১ অন্তর্ভুক্ত থাকবে কিন্তু ৫ থাকবে না।
4. Range এর সাধারণ ব্যবহার
গুয়াভা লাইব্রেরির Range ক্লাসটি বিভিন্ন কার্যক্রমে ব্যবহার করা যেতে পারে, যেমন:
- ফিল্টারিং: একটি রেঞ্জের মধ্যে থাকা উপাদানগুলো ফিল্টার করা।
- সংখ্যা সীমা নির্ধারণ: কোন দুটি সংখ্যা সীমার মধ্যে পড়ছে কিনা তা চেক করা।
- প্রতিটি মানের উপর অপারেশন: একটি নির্দিষ্ট রেঞ্জের মধ্যে থাকা প্রতিটি মানের উপর অপারেশন সম্পাদন করা।
উদাহরণ:
import com.google.common.collect.Range;
public class RangeExample {
public static void main(String[] args) {
// Creating a range [1, 10)
Range<Integer> range = Range.closedOpen(1, 10);
// Checking if a value is within the range
if (range.contains(5)) {
System.out.println("5 is within the range");
} else {
System.out.println("5 is not within the range");
}
// Checking if two ranges overlap
Range<Integer> range2 = Range.closed(8, 12);
System.out.println(range.isConnected(range2)); // true (the ranges overlap)
}
}
এখানে, range.isConnected(range2) চেক করছে যে দুটি রেঞ্জ কি একে অপরকে স্পর্শ করছে বা ওভারল্যাপ করছে।
উপকারিতা
- কোডের পরিষ্কারতা: বিভিন্ন ধরনের রেঞ্জ (open, closed, half-open) ব্যবহার করে কোড আরও পরিষ্কার এবং সুনির্দিষ্ট হয়।
- সীমা নির্ধারণ: নির্দিষ্ট সীমার মধ্যে উপাদানগুলিকে সহজে চিহ্নিত করা যায়।
- পারফরম্যান্স: রেঞ্জের মধ্যে থাকা উপাদানগুলোর উপর কার্যকরীভাবে অপারেশন সম্পাদন করা যায়।
সারাংশ
গুয়াভা লাইব্রেরির Range ক্লাসটি Java-তে রেঞ্জ পরিচালনার জন্য একটি শক্তিশালী টুল। এটি open, closed, এবং half-open রেঞ্জের ধারণাগুলি সমর্থন করে, যা কোডের মধ্যে শুরু এবং শেষ সীমার অন্তর্ভুক্তি বা নিষ্ক্রিয়তা নির্ধারণ করতে সাহায্য করে। এই রেঞ্জগুলি ব্যবহার করে আপনি খুব সহজেই সংখ্যার সীমা চিহ্নিত করতে পারেন এবং রেঞ্জের মধ্যে থাকা উপাদানগুলোর উপর বিভিন্ন কার্যক্রম পরিচালনা করতে পারেন।
গুয়াভা (Guava) লাইব্রেরি জাভা ডেভেলপারদের জন্য শক্তিশালী ডাটা স্ট্রাকচার সরবরাহ করে, যার মধ্যে RangeSet এবং RangeMap দুটি গুরুত্বপূর্ণ ডাটা স্ট্রাকচার। এই দুটি ডাটা স্ট্রাকচার নির্দিষ্ট রেঞ্জের মধ্যে উপাদান পরিচালনা করতে ব্যবহৃত হয়, যা ডেটা ম্যানিপুলেশন এবং অনুসন্ধানকে আরও দ্রুত এবং কার্যকরী করে তোলে।
এখানে আমরা RangeSet এবং RangeMap এর ব্যবহার এবং সুবিধাগুলি বিস্তারিতভাবে আলোচনা করব।
RangeSet
RangeSet হল একটি集合 যা একটি বা একাধিক রেঞ্জ (যেমন সংখ্যার পরিসীমা) ধারণ করে। এটি আপনাকে একটি নির্দিষ্ট পরিসীমার মধ্যে অবজেক্টের集合 সংরক্ষণ এবং পরিচালনা করতে সহায়ক। এটি মূলত বিভিন্ন পরিসীমার মধ্যে উপাদানগুলি ইনক্লুড বা এক্সক্লুড করার জন্য ব্যবহৃত হয়।
RangeSet এর বৈশিষ্ট্য
- রেঞ্জ ধারণকারী集合:
RangeSetএকাধিক পরিসীমা ধারণ করতে পারে, যেখানে প্রতিটি পরিসীমা একটি নির্দিষ্ট সীমা (min, max) ধারণ করে। - দ্বৈত পরিসীমা ধারণ: এটি একাধিক পরিসীমা (ranges) একত্রিত করার ক্ষমতা রাখে।
- অনুসন্ধান এবং পরিচালনা: এটি একটি নির্দিষ্ট পরিসীমা থেকে উপাদান খুঁজে বের করার জন্য উপযুক্ত।
RangeSet ব্যবহার উদাহরণ
import com.google.common.collect.Range;
import com.google.common.collect.TreeRangeSet;
public class GuavaRangeSetExample {
public static void main(String[] args) {
// TreeRangeSet ব্যবহার করে RangeSet তৈরি করা
TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
// বিভিন্ন রেঞ্জ যোগ করা
rangeSet.add(Range.closed(1, 10)); // 1 থেকে 10 (দ্বিতীয় পরিসীমা অন্তর্ভুক্ত)
rangeSet.add(Range.open(15, 20)); // 15 থেকে 20 (২০ অন্তর্ভুক্ত নয়)
rangeSet.add(Range.greaterThan(30)); // 30 এর চেয়ে বড় মান
// রেঞ্জের মধ্যে চেক করা
System.out.println("Is 5 in the range? " + rangeSet.contains(5)); // Output: true
System.out.println("Is 12 in the range? " + rangeSet.contains(12)); // Output: false
}
}
এখানে, TreeRangeSet ব্যবহার করে তিনটি রেঞ্জ যোগ করা হয়েছে। Range.closed(1, 10) রেঞ্জ ১ থেকে ১০ (১০ অন্তর্ভুক্ত) পর্যন্ত, Range.open(15, 20) রেঞ্জ ১৫ থেকে ২০ পর্যন্ত (২০ অন্তর্ভুক্ত নয়), এবং Range.greaterThan(30) রেঞ্জ ৩০ এর চেয়ে বড় মান রাখছে।
RangeMap
RangeMap হল একটি ডাটা স্ট্রাকচার যা রেঞ্জের সাথে মান (value) যুক্ত করে। এটি বিশেষভাবে ব্যবহার হয় যেখানে আপনি একটি পরিসীমা (range) দিয়ে মান (value) ম্যাপ করতে চান। RangeMap ডাটা স্ট্রাকচারের মধ্যে আপনি একটি রেঞ্জের জন্য মান অ্যাসাইন করতে পারেন এবং পরে একটি নির্দিষ্ট রেঞ্জের জন্য মান খুঁজে বের করতে পারেন।
RangeMap এর বৈশিষ্ট্য
- রেঞ্জ ও মানের ম্যাপিং:
RangeMapআপনাকে একটি রেঞ্জের জন্য একটি মান সংরক্ষণ করতে দেয়। - দ্বৈত মান পরিচালনা: একাধিক পরিসীমা এবং তাদের মানগুলির মধ্যে সম্পর্ক প্রতিষ্ঠা করতে সহায়ক।
- দ্রুত অনুসন্ধান: এটি ডেটা অনুসন্ধান এবং পরিচালনার জন্য কার্যকরী।
RangeMap ব্যবহার উদাহরণ
import com.google.common.collect.Range;
import com.google.common.collect.TreeRangeMap;
public class GuavaRangeMapExample {
public static void main(String[] args) {
// TreeRangeMap ব্যবহার করে RangeMap তৈরি করা
TreeRangeMap<Integer, String> rangeMap = TreeRangeMap.create();
// রেঞ্জ এবং মান যোগ করা
rangeMap.put(Range.closed(1, 10), "Low");
rangeMap.put(Range.open(10, 20), "Medium");
rangeMap.put(Range.greaterThan(20), "High");
// রেঞ্জের মান খুঁজে বের করা
System.out.println("Value for 5: " + rangeMap.get(5)); // Output: Low
System.out.println("Value for 15: " + rangeMap.get(15)); // Output: Medium
System.out.println("Value for 25: " + rangeMap.get(25)); // Output: High
}
}
এখানে, TreeRangeMap ব্যবহার করে একটি রেঞ্জ এবং তাদের সম্পর্কিত মান সংরক্ষণ করা হয়েছে। Range.closed(1, 10) রেঞ্জের জন্য "Low", Range.open(10, 20) রেঞ্জের জন্য "Medium" এবং Range.greaterThan(20) রেঞ্জের জন্য "High" মান সংরক্ষিত হয়েছে।
RangeSet এবং RangeMap এর সুবিধা
RangeSet এর সুবিধা
- রেঞ্জ অনুসন্ধান:
RangeSetদ্রুতভাবে রেঞ্জের মধ্যে উপাদান চেক করার সুবিধা দেয়। - মাল্টিপল রেঞ্জ পরিচালনা: একাধিক রেঞ্জ একত্রে সংরক্ষণ এবং পরিচালনা করা সহজ।
- অপারেশন সুবিধা: পরিসীমা পরীক্ষা, যোগ, অপসারণ এবং মার্জ করা সহজ।
RangeMap এর সুবিধা
- রেঞ্জ এবং মানের সম্পর্ক: রেঞ্জের জন্য মান সংরক্ষণ এবং অনুসন্ধান করা সহজ এবং দ্রুত।
- ডাইনামিক রেঞ্জ ম্যাপিং: এটি আপনাকে রেঞ্জের জন্য মান গঠন এবং পরিবর্তন করতে দেয়।
- পুনঃব্যবহারযোগ্যতা: একাধিক রেঞ্জের জন্য মান ব্যবহারের মাধ্যমে কোড পুনঃব্যবহারযোগ্য হয়।
গুয়াভা লাইব্রেরির RangeSet এবং RangeMap ডাটা স্ট্রাকচারগুলি জাভাতে রেঞ্জ ভিত্তিক ডাটা ম্যানিপুলেশনকে আরও সহজ এবং কার্যকরী করে তোলে। RangeSet রেঞ্জের মধ্যে উপাদান সংরক্ষণ এবং পরিচালনার জন্য ব্যবহৃত হয়, এবং RangeMap রেঞ্জের সাথে মানের ম্যাপিং করার জন্য ব্যবহৃত হয়। এই দুটি স্ট্রাকচার ডেভেলপারদের জটিল ডাটা ম্যানিপুলেশন কাজে সহায়ক এবং কর্মক্ষমতা উন্নত করতে সাহায্য করে।
Guava লাইব্রেরি Range ক্লাস সরবরাহ করে, যা একটি রেঞ্জ (অথবা সীমা) তৈরি করতে এবং বিভিন্ন রেঞ্জ অপারেশন করতে সাহায্য করে। এটি একটি শক্তিশালী টুল যা কোনো নির্দিষ্ট সীমার মধ্যে মান চেক করতে, বিভিন্ন সীমার সাথে তুলনা করতে, এবং সেই রেঞ্জের মধ্যে ডেটা বা মান সংরক্ষণ করতে ব্যবহৃত হয়। Guava এর Range ক্লাসটি মূলত Comparable মানের জন্য ব্যবহৃত হয়, যেখানে আপনি একটি নির্দিষ্ট সীমা নির্ধারণ করতে পারেন এবং সেই সীমার মধ্যে কীভাবে অপারেশন করতে হবে তা পরিচালনা করতে পারেন।
Range Operations এর ধারণা
Guava এর Range ক্লাস আপনাকে দুটি ধরনের অপারেশন করতে সাহায্য করে:
- Range creation: একটি নির্দিষ্ট সীমা তৈরি করা।
- Range operations: রেঞ্জের মধ্যে বিভিন্ন অপারেশন যেমন সদস্যতা পরীক্ষা, রেঞ্জ ম্যানিপুলেশন (জোড়া করা, বিচ্ছিন্ন করা, ইত্যাদি)।
Range ক্লাসের প্রধান মেথড
Range.closed(): এটি একটি অন্তর্ভুক্ত রেঞ্জ তৈরি করে (লঘু সীমা এবং উচ্চ সীমা উভয়ই অন্তর্ভুক্ত থাকে)।Range.open(): এটি একটি ওপেন রেঞ্জ তৈরি করে (লঘু সীমা এবং উচ্চ সীমা উভয়ই বাদ পড়ে)।Range.closedOpen(): এটি একটি রেঞ্জ তৈরি করে যা লঘু সীমা অন্তর্ভুক্ত কিন্তু উচ্চ সীমা বাদ পড়ে।Range.openClosed(): এটি একটি রেঞ্জ তৈরি করে যা উচ্চ সীমা অন্তর্ভুক্ত কিন্তু লঘু সীমা বাদ পড়ে।Range.contains(): এটি চেক করে যে একটি নির্দিষ্ট মান রেঞ্জের মধ্যে রয়েছে কিনা।Range.isConnected(): এটি চেক করে যে দুটি রেঞ্জ সংযুক্ত কিনা।
বাস্তব উদাহরণ
ধরা যাক, একটি অ্যাপ্লিকেশন তৈরি করা হচ্ছে যেখানে কোনো নির্দিষ্ট বয়সের মধ্যে ব্যবহারকারীদের জন্য কিছু সেবা প্রদান করা হবে। এখানে আমরা Range ক্লাস ব্যবহার করে একটি বয়সের রেঞ্জ তৈরি করব এবং তারপর সেই রেঞ্জের মধ্যে কিছু ভ্যালু চেক করব।
উদাহরণ:
import com.google.common.collect.Range;
public class RangeExample {
public static void main(String[] args) {
// রেঞ্জ তৈরি: 18 থেকে 60 (বয়সের রেঞ্জ)
Range<Integer> ageRange = Range.closed(18, 60);
// কিছু বয়স চেক করা
System.out.println(ageRange.contains(25)); // true, 25 ১৮ থেকে ৬০ এর মধ্যে
System.out.println(ageRange.contains(17)); // false, ১৭ রেঞ্জের বাইরে
System.out.println(ageRange.contains(60)); // true, ৬০ রেঞ্জের মধ্যে অন্তর্ভুক্ত
// রেঞ্জের মধ্যে সংযুক্ত কিনা চেক করা
Range<Integer> anotherRange = Range.closed(30, 40);
System.out.println(ageRange.isConnected(anotherRange)); // true, দুইটি রেঞ্জ সংযুক্ত
System.out.println(ageRange.intersection(anotherRange)); // [30..40], সংযোগিত রেঞ্জ দেখাবে
// একটি রেঞ্জ তৈরি করা যেখানে উচ্চ সীমা বাদ দেওয়া হয়েছে
Range<Integer> rangeWithoutUpper = Range.closedOpen(18, 60);
System.out.println(rangeWithoutUpper.contains(60)); // false, ৬০ এখানে অন্তর্ভুক্ত নয়
}
}
উদাহরণ ব্যাখ্যা:
Range.closed(18, 60): এটি একটি রেঞ্জ তৈরি করেছে যা ১৮ থেকে ৬০ পর্যন্ত, যেখানে ১৮ এবং ৬০ উভয়ই অন্তর্ভুক্ত।ageRange.contains(25): এই অপারেশনটি চেক করবে যে ২৫ এই রেঞ্জের মধ্যে রয়েছে কিনা। যেহেতু ২৫ ১৮ থেকে ৬০ এর মধ্যে পড়ে, তাই এটিtrueরিটার্ন করবে।ageRange.contains(17): এটি চেক করবে যে ১৭ এই রেঞ্জের মধ্যে রয়েছে কিনা। যেহেতু ১৭ এই রেঞ্জের বাইরে, তাই এটিfalseরিটার্ন করবে।ageRange.isConnected(anotherRange): এটি চেক করে যে দুটি রেঞ্জ একে অপরের সাথে সংযুক্ত কিনা। যেহেতু ১৮-৬০ এবং ৩০-৪০ রেঞ্জ একে অপরের সাথে সংযুক্ত, এটিtrueরিটার্ন করবে।ageRange.intersection(anotherRange): এটি দুটি রেঞ্জের মধ্যে যে সাধারণ অংশ রয়েছে তা বের করবে। এখানে এটি ৩০ থেকে ৪০ পর্যন্ত রেঞ্জ দেখাবে।Range.closedOpen(18, 60): এটি একটি রেঞ্জ তৈরি করবে যেখানে ১৮ অন্তর্ভুক্ত কিন্তু ৬০ অন্তর্ভুক্ত নয়। যখন ৬০ চেক করা হবে, তখন এটিfalseরিটার্ন করবে।
Range Operations এর ব্যবহার
Guava লাইব্রেরির Range ক্লাসটি বিভিন্ন পরিস্থিতিতে ব্যবহার করা যেতে পারে, যেমন:
- ভ্যালিডেশন: নির্দিষ্ট সীমার মধ্যে মান থাকা উচিত কিনা তা যাচাই করার জন্য।
- সোর্স এবং টার্গেট রেঞ্জের মধ্যে মান সন্নিবেশ করা: বিশেষ করে যদি দুটি ভিন্ন রেঞ্জের মধ্যে সম্পর্ক পরীক্ষা করতে হয় (যেমন স্টোরেজ কুলিং সিস্টেমের জন্য বা সময়কাল নির্ধারণ করতে)।
- ডেটা প্রক্রিয়াকরণ: বিভিন্ন ডেটা পয়েন্টের মধ্যে সাধারণ বা সংযুক্ত রেঞ্জ বের করা।
Guava লাইব্রেরির Range ক্লাস ব্যবহার করে রেঞ্জ সম্পর্কিত বিভিন্ন অপারেশন সহজ এবং কার্যকরীভাবে সম্পাদিত হতে পারে। এটি কোডে রেঞ্জ যাচাই, রেঞ্জের মধ্যে ডেটা সংরক্ষণ এবং অন্যান্য কার্যকরী অপারেশন করার জন্য অত্যন্ত উপকারী একটি সরঞ্জাম।
Read more