Java Collections Framework একটি শক্তিশালী গ্রন্থাগার যা বিভিন্ন ধরনের ডেটা স্ট্রাকচার (যেমন লিস্ট, সেট, ম্যাপ) এবং তাদের সাথে কাজ করার জন্য প্রয়োজনীয় ক্লাস এবং ইন্টারফেস প্রদান করে। এই ফ্রেমওয়ার্কের মাধ্যমে ডেটা স্টোর এবং প্রসেসিং অনেক সহজ এবং কার্যকরী হয়ে ওঠে।
এখানে আমি কিছু Java Collections Framework এর সাধারণ উদাহরণ দেখাবো যেখানে বিভিন্ন ডেটা স্ট্রাকচার ব্যবহার করা হয়েছে।
ArrayList
হল একটি List ইন্টারফেসের বাস্তবায়ন যা অর্ডার রাখা এবং ডুপ্লিকেট উপাদান সমর্থন করে। এটি dynamic array হিসেবে কাজ করে।
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
// ArrayList তৈরি
ArrayList<String> list = new ArrayList<>();
// Elements যোগ করা
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Elements প্রদর্শন করা
System.out.println("List: " + list);
// List থেকে একটি উপাদান সরানো
list.remove("Banana");
System.out.println("After removing Banana: " + list);
// List এর সাইজ চেক করা
System.out.println("List size: " + list.size());
// List এর মধ্যে একটি উপাদান চেক করা
if (list.contains("Apple")) {
System.out.println("Apple is in the list.");
}
}
}
Output:
List: [Apple, Banana, Orange]
After removing Banana: [Apple, Orange]
List size: 2
Apple is in the list.
HashSet
হল একটি Set ইন্টারফেসের বাস্তবায়ন যা অর্ডার রক্ষা করে না এবং ডুপ্লিকেট উপাদান সমর্থন করে না। এটি সাধারণত unique মান সংরক্ষণ করতে ব্যবহৃত হয়।
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
// HashSet তৈরি
HashSet<String> set = new HashSet<>();
// Elements যোগ করা
set.add("Apple");
set.add("Banana");
set.add("Orange");
set.add("Apple"); // Duplicate element will not be added
// Set প্রদর্শন করা
System.out.println("Set: " + set);
// Set এর মধ্যে একটি উপাদান চেক করা
if (set.contains("Orange")) {
System.out.println("Orange is in the set.");
}
// Set থেকে একটি উপাদান সরানো
set.remove("Banana");
System.out.println("After removing Banana: " + set);
}
}
Output:
Set: [Apple, Banana, Orange]
Orange is in the set.
After removing Banana: [Apple, Orange]
HashMap
হল একটি Map ইন্টারফেসের বাস্তবায়ন যা কীগুলির সাথে মান (value) সংরক্ষণ করে। এটি null কী এবং মান সমর্থন করে, এবং কোন অর্ডার রক্ষা করে না।
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// HashMap তৈরি
HashMap<Integer, String> map = new HashMap<>();
// Key-value pair যোগ করা
map.put(1, "Apple");
map.put(2, "Banana");
map.put(3, "Orange");
// Map প্রদর্শন করা
System.out.println("Map: " + map);
// Map থেকে একটি মান বের করা
System.out.println("Value for key 2: " + map.get(2));
// Map থেকে একটি key-value pair সরানো
map.remove(1);
System.out.println("After removing key 1: " + map);
// Map এর মধ্যে একটি key চেক করা
if (map.containsKey(3)) {
System.out.println("Key 3 is present in the map.");
}
}
}
Output:
Map: {1=Apple, 2=Banana, 3=Orange}
Value for key 2: Banana
After removing key 1: {2=Banana, 3=Orange}
Key 3 is present in the map.
LinkedList
হল একটি List ইন্টারফেসের বাস্তবায়ন যা ডাবল লিঙ্কড লিস্ট হিসেবে কাজ করে। এটি ইনসার্ট এবং ডিলিট অপারেশনের জন্য দ্রুত।
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
// LinkedList তৈরি
LinkedList<String> list = new LinkedList<>();
// Elements যোগ করা
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Elements প্রদর্শন করা
System.out.println("LinkedList: " + list);
// List এর প্রথম এবং শেষ উপাদান দেখানো
System.out.println("First element: " + list.getFirst());
System.out.println("Last element: " + list.getLast());
// List থেকে একটি উপাদান সরানো
list.removeFirst();
System.out.println("After removing first element: " + list);
list.removeLast();
System.out.println("After removing last element: " + list);
}
}
Output:
LinkedList: [Apple, Banana, Orange]
First element: Apple
Last element: Orange
After removing first element: [Banana, Orange]
After removing last element: [Banana]
PriorityQueue
হল একটি Queue ইন্টারফেসের বাস্তবায়ন যা একটি প্রাথমিকতার ভিত্তিতে উপাদানকে সাজায়।
import java.util.PriorityQueue;
public class PriorityQueueExample {
public static void main(String[] args) {
// PriorityQueue তৈরি
PriorityQueue<String> queue = new PriorityQueue<>();
// Elements যোগ করা
queue.add("Apple");
queue.add("Banana");
queue.add("Orange");
// PriorityQueue থেকে উপাদান বের করা (Minimum element first)
System.out.println("Queue: " + queue);
// Remove elements based on priority
while (!queue.isEmpty()) {
System.out.println("Removed: " + queue.poll());
}
}
}
Output:
Queue: [Apple, Banana, Orange]
Removed: Apple
Removed: Banana
Removed: Orange
Java Collections Framework ব্যবহার করলে আপনি বিভিন্ন ধরনের ডেটা স্ট্রাকচার যেমন List, Set, Map, Queue ইত্যাদি ব্যবহারের মাধ্যমে আপনার প্রোগ্রামকে আরও মডুলার, দক্ষ এবং সহজে পরিচালনাযোগ্য করতে পারবেন। প্রতিটি ডেটা স্ট্রাকচারের নিজস্ব সুবিধা এবং কার্যকারিতা আছে এবং Collections API আপনাকে এগুলো ব্যবহারের জন্য সরঞ্জাম প্রদান করে।
ArrayList হলো Java Collection Framework এর একটি অংশ, যা একটি dynamic array তৈরি করে, যেখানে ফাইলের আকার স্বয়ংক্রিয়ভাবে বাড়ানো বা কমানো যায়। এটি একটি resizable array যা প্রাথমিকভাবে ফিক্সড সাইজের অ্যারের মত কাজ করে, কিন্তু এর মধ্যে ফাইলের সাইজ পরিবর্তন করা যায় এবং এটি null values এবং ডুপ্লিকেট মান অনুমোদন করে।
এখানে একটি উদাহরণ দেওয়া হলো যা দেখাবে কিভাবে ArrayList ব্যবহার করে ডায়নামিক অ্যারে তৈরি করা যায় এবং এর মাধ্যমে ডেটা যোগ, মুছা এবং অ্যাক্সেস করা যায়।
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
// ArrayList তৈরি করা
ArrayList<String> fruits = new ArrayList<>();
// ArrayList-এ উপাদান যোগ করা
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Mango");
// ArrayList-এ উপাদান প্রিন্ট করা
System.out.println("ArrayList elements:");
for (String fruit : fruits) {
System.out.println(fruit);
}
// ArrayList এর আকার প্রিন্ট করা
System.out.println("\nArrayList size: " + fruits.size());
// নির্দিষ্ট উপাদান অ্যাক্সেস করা (index দ্বারা)
System.out.println("\nElement at index 2: " + fruits.get(2));
// ArrayList-এ একটি উপাদান মুছে ফেলা
fruits.remove("Banana"); // "Banana" মুছে ফেলা
// ArrayList-এ উপাদান প্রিন্ট করা পরবর্তী পরিবর্তনের পর
System.out.println("\nArrayList after removal:");
for (String fruit : fruits) {
System.out.println(fruit);
}
// ArrayList-এ একটি উপাদান পরিবর্তন করা
fruits.set(1, "Papaya"); // index 1 এ "Mango" পরিবর্তন করে "Papaya" রাখা
// পরিবর্তিত ArrayList প্রিন্ট করা
System.out.println("\nArrayList after modification:");
for (String fruit : fruits) {
System.out.println(fruit);
}
// ArrayList-এ নির্দিষ্ট উপাদান আছে কিনা চেক করা
if (fruits.contains("Apple")) {
System.out.println("\nApple is present in the ArrayList.");
}
// ArrayList পরিষ্কার করা
fruits.clear();
System.out.println("\nArrayList after clearing: " + fruits);
}
}
ArrayList<String> fruits = new ArrayList<>();
— এখানে ArrayList
তৈরি করা হয়েছে যা শুধুমাত্র String
ধরনের ডেটা ধারণ করবে।fruits.add("Apple");
— .add()
মেথড ব্যবহার করে বিভিন্ন মান অ্যারে লিস্টে যোগ করা হয়েছে।for
লুপ ব্যবহার করে ArrayList এর সকল উপাদান প্রিন্ট করা হয়েছে।fruits.size()
দিয়ে ArrayList এর আকার (এখানে 4) প্রিন্ট করা হয়েছে।fruits.get(2);
— .get()
মেথড ব্যবহার করে নির্দিষ্ট ইনডেক্স (এখানে 2) থেকে উপাদান অ্যাক্সেস করা হয়েছে। এখানে Cherry
প্রিন্ট হবে।fruits.remove("Banana");
— .remove()
মেথড ব্যবহার করে "Banana" উপাদানটি মুছে ফেলা হয়েছে।fruits.set(1, "Papaya");
— .set()
মেথড ব্যবহার করে ইনডেক্স 1 এ থাকা মান পরিবর্তন করে "Papaya"
রাখা হয়েছে।fruits.contains("Apple");
— .contains()
মেথড ব্যবহার করে ArrayList এ নির্দিষ্ট মান ("Apple"
) আছে কিনা চেক করা হয়েছে।fruits.clear();
— .clear()
মেথড ব্যবহার করে ArrayList এর সকল উপাদান মুছে ফেলা হয়েছে।ArrayList elements:
Apple
Banana
Cherry
Mango
ArrayList size: 4
Element at index 2: Cherry
ArrayList after removal:
Apple
Cherry
Mango
ArrayList after modification:
Apple
Papaya
Mango
Apple is present in the ArrayList.
ArrayList after clearing: []
.add()
, .remove()
, .contains()
, .get()
, .size()
, .clear()
ইত্যাদি, যা ডেটার ম্যানিপুলেশন সহজ করে তোলে।Java তে ArrayList ব্যবহার করে dynamic arrays তৈরি করা এবং তাদের উপাদান ম্যানিপুলেট করা খুবই সহজ। এটি একটি অত্যন্ত কার্যকরী ডেটা স্ট্রাকচার যেটি দ্রুত এবং ফ্লেক্সিবলভাবে ডেটা ম্যানিপুলেট করতে সাহায্য করে।
Java তে HashMap
হল একটি ডেটা স্ট্রাকচার যা key-value pair ভিত্তিতে ডেটা সংরক্ষণ করে। HashMap হলো একটি Map ইন্টারফেসের বাস্তবায়ন যা ডেটাকে একটি নির্দিষ্ট key এর সাথে value যুক্ত করে রাখে। এটি null কী এবং মান অনুমোদিত করে, এবং ডেটা দ্রুত অ্যাক্সেস করতে hashing ব্যবহার করে।
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// HashMap তৈরি করা (key: String, value: Integer)
HashMap<String, Integer> studentGrades = new HashMap<>();
// HashMap এ ডেটা যোগ করা
studentGrades.put("Alice", 85);
studentGrades.put("Bob", 92);
studentGrades.put("Charlie", 88);
studentGrades.put("David", 95);
// HashMap থেকে ডেটা এক্সট্রাক্ট করা (key এর মাধ্যমে)
System.out.println("Alice's grade: " + studentGrades.get("Alice"));
System.out.println("Bob's grade: " + studentGrades.get("Bob"));
// HashMap এ কোনো কী আছে কিনা চেক করা
if (studentGrades.containsKey("Charlie")) {
System.out.println("Charlie exists in the map with grade: " + studentGrades.get("Charlie"));
}
// HashMap থেকে একটি নির্দিষ্ট কী-ভ্যালু জোড়া মুছে ফেলা
studentGrades.remove("David");
// সমস্ত কী এবং ভ্যালু প্রদর্শন করা
System.out.println("\nUpdated Student Grades:");
for (String key : studentGrades.keySet()) {
System.out.println(key + ": " + studentGrades.get(key));
}
// HashMap এর আকার
System.out.println("\nTotal students: " + studentGrades.size());
}
}
HashMap<String, Integer> studentGrades = new HashMap<>();
— এখানে একটি HashMap তৈরি করা হয়েছে যার key হল String
(যেমন ছাত্রের নাম), এবং value হল Integer
(যেমন ছাত্রের গ্রেড)।put()
মেথড দিয়ে ডেটা যোগ করা:studentGrades.put("Alice", 85);
— put()
মেথডের মাধ্যমে key
(যেমন, "Alice") এবং value
(যেমন, 85) যোগ করা হয়েছে।get()
মেথড দিয়ে ডেটা অ্যাক্সেস করা:studentGrades.get("Alice");
— get()
মেথড ব্যবহার করে একটি নির্দিষ্ট কী থেকে মান পাওয়া যায়।containsKey()
মেথড দিয়ে কী চেক করা:studentGrades.containsKey("Charlie");
— containsKey()
মেথড দ্বারা চেক করা হয় যে, "Charlie" কীটি HashMap-এ আছে কিনা।remove()
মেথড দিয়ে ডেটা মুছে ফেলা:studentGrades.remove("David");
— remove()
মেথড ব্যবহার করে "David" কী-টি মুছে ফেলা হয়েছে।keySet()
মেথড দিয়ে সমস্ত কী এবং মান প্রিন্ট করা:studentGrades.keySet()
— এই মেথডটি সমস্ত কী সংগ্রহ করে, এবং আমরা get(key)
ব্যবহার করে প্রতিটি কী-এর মান অ্যাক্সেস করতে পারি।size()
মেথড দিয়ে HashMap এর আকার পাওয়া:studentGrades.size();
— size()
মেথড দ্বারা HashMap-এর মোট উপাদানের সংখ্যা পাওয়া যায়।Alice's grade: 85
Bob's grade: 92
Charlie exists in the map with grade: 88
Updated Student Grades:
Alice: 85
Bob: 92
Charlie: 88
Total students: 3
HashMap
ডেটা key-value pair হিসেবে সংরক্ষণ করে। এখানে key হল ইউনিক এবং value হল তার সাথে সংশ্লিষ্ট মান।HashMap
ফাইলের মধ্যে সংরক্ষিত ডেটার অর্ডার guaranteed নয়। অর্থাৎ, ডেটা কোনো নির্দিষ্ট ক্রমে থাকবে না।HashMap
এ একটি null কী এবং অনেকগুলো null ভ্যালু থাকতে পারে। তবে, একটি null কী একটিই থাকতে পারে।HashMap
দ্রুত কাজ করে কারণ এটি hashing ব্যবহার করে ডেটা খুঁজে বের করতে, অ্যাক্সেস করতে এবং সংরক্ষণ করতে।HashMap
দ্বারা দ্রুতভাবে key এর মাধ্যমে value এক্সেস করা যায়। এটি সাধারণত O(1) টাইম কমপ্লেক্সিটি প্রদান করে।HashMap
ফাইলের সাইজ অ্যাড বা রিমুভ করার সাথে সাথে স্বয়ংক্রিয়ভাবে পরিবর্তন হয়।HashMap
হল Java-তে key-value pair ভিত্তিক ডেটা স্টোরেজের একটি শক্তিশালী এবং দক্ষ পদ্ধতি। এটি দ্রুত ডেটা অ্যাক্সেস, মডিফিকেশন, এবং সন্ধান করার জন্য অত্যন্ত কার্যকরী। Java-তে HashMap
ব্যবহার করে ডেটার স্থায়ী সংরক্ষণ, অনুসন্ধান এবং সঞ্চালন করা সহজ এবং দ্রুত হয়।
HashSet এবং TreeSet হল Java Collections Framework এর দুইটি জনপ্রিয় Set ইন্টারফেসের বাস্তবায়ন। উভয়ের মধ্যে মূল পার্থক্য হল, HashSet এলিমেন্টগুলিকে যেভাবে আসে তেমনভাবে রাখে, অর্থাৎ কোন নির্দিষ্ট অর্ডারে রাখে না, তবে TreeSet এলিমেন্টগুলিকে স্বাভাবিক ক্রম (natural order) বা আপনার দেওয়া কাস্টম কম্প্যারেটরের ভিত্তিতে সাজায়।
HashSet একটি সেট যা ডুপ্লিকেট এলিমেন্ট সমর্থন করে না এবং এলিমেন্টগুলোকে কোন নির্দিষ্ট অর্ডারে রাখে না।
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
// HashSet তৈরি করা
HashSet<String> set = new HashSet<>();
// HashSet এ কিছু এলিমেন্ট যোগ করা
set.add("Apple");
set.add("Banana");
set.add("Orange");
set.add("Apple"); // Duplicate element, this will be ignored
// HashSet এর এলিমেন্ট প্রিন্ট করা
System.out.println("HashSet Elements: " + set);
}
}
আউটপুট:
HashSet Elements: [Apple, Banana, Orange]
ব্যাখ্যা:
set.add("Apple");
: প্রথমবার Apple
যোগ করা হবে, কিন্তু পরবর্তীবার ডুপ্লিকেট হিসেবে যোগ হওয়া Apple
উপেক্ষা করা হবে।TreeSet একটি Sorted Set যা ইনপুট এলিমেন্টগুলিকে প্রাক-নির্ধারিত ক্রমে সাজিয়ে রাখে (যেমন অ্যাসেন্ডিং বা ডেসেন্ডিং অর্ডার)। এটি Natural Ordering বা কাস্টম Comparator ব্যবহার করে সাজানো হয়।
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
// TreeSet তৈরি করা
TreeSet<String> set = new TreeSet<>();
// TreeSet এ কিছু এলিমেন্ট যোগ করা
set.add("Banana");
set.add("Apple");
set.add("Orange");
set.add("Mango");
// TreeSet এর এলিমেন্ট প্রিন্ট করা
System.out.println("TreeSet Elements: " + set);
}
}
আউটপুট:
TreeSet Elements: [Apple, Banana, Mango, Orange]
ব্যাখ্যা:
Apple
, Banana
, Mango
, Orange
সোজা অর্ডারে সাজানো হয়েছে।বৈশিষ্ট্য | HashSet | TreeSet |
---|---|---|
অর্ডারিং | কোন নির্দিষ্ট অর্ডার নেই | প্রাক-নির্ধারিত ক্রম (Ascending Order) |
ডুপ্লিকেট এলিমেন্ট | ডুপ্লিকেট এলিমেন্ট রাখা হয় না | ডুপ্লিকেট এলিমেন্ট রাখা হয় না |
পারফরম্যান্স | তীব্র পারফরম্যান্স (অর্ডার করার জন্য সময় লাগে না) | একটু ধীর, কারণ এটি সজ্জিত থাকতে হয় |
ইনটারফেস | Set ইনটারফেসের বাস্তবায়ন | NavigableSet ইনটারফেসের বাস্তবায়ন |
lower()
, higher()
, pollFirst()
, pollLast()
ইত্যাদি সুবিধা প্রদান করে, যা নির্দিষ্ট এলিমেন্টের আগে বা পরে থাকা এলিমেন্ট পাওয়ার জন্য উপযোগী।এই দুইটি Set-এর মধ্যে আপনি আপনার প্রয়োজনে নির্বাচন করতে পারেন: যদি অর্ডার গুরুত্বপূর্ণ না হয় তবে HashSet, আর যদি অর্ডার গুরুত্বপূর্ণ হয় তবে TreeSet ব্যবহার করা যেতে পারে।
Queue এবং PriorityQueue Java Collections Framework এর অংশ, যা FIFO (First-In-First-Out) আর্কিটেকচার অনুসরণ করে এবং বিভিন্ন ধরনের ডেটা স্ট্রাকচার পরিচালনা করতে সাহায্য করে। Queue সাধারণত কোনো ডেটা প্রবাহের পরিচালনা করতে ব্যবহৃত হয়, যেখানে প্রথমে ঢোকানো এলিমেন্ট প্রথমে বের হয়।
PriorityQueue একটি বিশেষ ধরনের Queue যেখানে এলিমেন্টগুলিকে তাদের প্রাধান্য (priority) অনুযায়ী সাজানো হয়, অর্থাৎ সবচেয়ে গুরুত্বপূর্ণ (এবং নির্ধারিত priority) এলিমেন্টটি প্রথমে বের হবে।
নিচে Queue এবং PriorityQueue ব্যবহারের উদাহরণ দেওয়া হলো।
Queue সাধারণভাবে FIFO (First-In-First-Out) ভিত্তিক ডেটা স্ট্রাকচার। এর মধ্যে প্রথমে ঢোকানো উপাদানটি প্রথমে বের হবে। Java তে Queue
interface এর মাধ্যমে এই ডেটা স্ট্রাকচার পরিচালনা করা হয়।
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
// Queue অবজেক্ট তৈরি করা (LinkedList ক্লাস ব্যবহার করা হয়েছে Queue ইন্টারফেসের জন্য)
Queue<String> queue = new LinkedList<>();
// Queue তে উপাদান যোগ করা
queue.add("Apple");
queue.add("Banana");
queue.add("Cherry");
queue.add("Date");
// Queue তে থাকা উপাদানগুলি প্রিন্ট করা
System.out.println("Queue: " + queue);
// প্রথম উপাদান বের করা (FIFO)
System.out.println("Removed: " + queue.poll()); // Apple - First element (FIFO)
// পরবর্তীতে অবশিষ্ট উপাদান প্রিন্ট করা
System.out.println("Queue after removal: " + queue);
// Peek: পরবর্তী এলিমেন্ট দেখতে হবে (প্রথম ইন)
System.out.println("Next element to be removed: " + queue.peek()); // Banana
}
}
আউটপুট:
Queue: [Apple, Banana, Cherry, Date]
Removed: Apple
Queue after removal: [Banana, Cherry, Date]
Next element to be removed: Banana
ব্যাখ্যা:
Queue
interface ব্যবহার করে একটি LinkedList
ডেটা স্ট্রাকচার তৈরি করা হয়েছে।add()
মেথড দিয়ে Queue তে এলিমেন্ট যোগ করা হয়েছে।poll()
মেথড দিয়ে Queue থেকে প্রথম এলিমেন্ট বের করা হয়েছে (FIFO প্রক্রিয়া অনুযায়ী)।peek()
মেথড ব্যবহার করে পরবর্তী এলিমেন্ট দেখা গেছে যা FIFO অনুযায়ী বের হবে।PriorityQueue একটি বিশেষ Queue যেখানে প্রতিটি এলিমেন্টের priority অনুযায়ী সাজানো হয়। PriorityQueue
এর মাধ্যমে আপনি একটি এলিমেন্টের priority নির্ধারণ করে ডেটা স্ট্রাকচার পরিচালনা করতে পারেন। সবচেয়ে কম priority বা সবচেয়ে বেশি priority সহ এলিমেন্টটি প্রথমে বের হয় (ডিফল্টভাবে এটি natural ordering
অনুসরণ করে, তবে Comparator
ব্যবহার করে কাস্টম অর্ডারিং করা যেতে পারে)।
import java.util.PriorityQueue;
public class PriorityQueueExample {
public static void main(String[] args) {
// PriorityQueue অবজেক্ট তৈরি করা
PriorityQueue<String> priorityQueue = new PriorityQueue<>();
// Queue তে উপাদান যোগ করা
priorityQueue.add("Apple");
priorityQueue.add("Banana");
priorityQueue.add("Cherry");
priorityQueue.add("Date");
// PriorityQueue তে থাকা উপাদানগুলি প্রিন্ট করা (Natural order: Alphabetically)
System.out.println("PriorityQueue (Natural order): " + priorityQueue);
// প্রথম উপাদান বের করা (priority অনুযায়ী)
System.out.println("Removed: " + priorityQueue.poll()); // Apple - smallest according to alphabetic order
// পরবর্তীতে অবশিষ্ট উপাদান প্রিন্ট করা
System.out.println("PriorityQueue after removal: " + priorityQueue);
// Peek: পরবর্তী এলিমেন্ট দেখতে হবে
System.out.println("Next element to be removed: " + priorityQueue.peek()); // Banana
}
}
আউটপুট:
PriorityQueue (Natural order): [Apple, Banana, Cherry, Date]
Removed: Apple
PriorityQueue after removal: [Banana, Date, Cherry]
Next element to be removed: Banana
ব্যাখ্যা:
PriorityQueue
দ্বারা ডেটা সাজানো হচ্ছে alphabetically, কারণ PriorityQueue
ডিফল্টভাবে natural ordering
অনুসরণ করে।poll()
মেথড দ্বারা সবচেয়ে ছোট এলিমেন্ট (এখানে Apple
) বের করা হয়েছে।peek()
মেথড ব্যবহার করে পরবর্তী এলিমেন্টটি দেখা গেছে যা priority অনুযায়ী বের হবে (এখানে Banana
).আপনি যদি কাস্টম ordering চান, তবে Comparator
ব্যবহার করে PriorityQueue
তে কাস্টম সাজানো ব্যবস্থা করতে পারেন। নিচে একটি উদাহরণ দেওয়া হলো যেখানে priority queue সংখ্যা অনুযায়ী সাজানো হবে।
import java.util.PriorityQueue;
import java.util.Comparator;
public class CustomPriorityQueueExample {
public static void main(String[] args) {
// Custom Comparator দিয়ে PriorityQueue তৈরি করা যাতে বড় সংখ্যাগুলি আগে আসে
PriorityQueue<Integer> customQueue = new PriorityQueue<>(Comparator.reverseOrder());
// Queue তে উপাদান যোগ করা
customQueue.add(10);
customQueue.add(20);
customQueue.add(5);
customQueue.add(15);
// PriorityQueue তে থাকা উপাদানগুলি প্রিন্ট করা (Descending order)
System.out.println("Custom PriorityQueue (Descending order): " + customQueue);
// প্রথম উপাদান বের করা (Priority অনুযায়ী, বড় থেকে ছোট)
System.out.println("Removed: " + customQueue.poll()); // 20
// পরবর্তীতে অবশিষ্ট উপাদান প্রিন্ট করা
System.out.println("Custom PriorityQueue after removal: " + customQueue);
// Peek: পরবর্তী এলিমেন্ট দেখতে হবে
System.out.println("Next element to be removed: " + customQueue.peek()); // 15
}
}
আউটপুট:
Custom PriorityQueue (Descending order): [20, 15, 10, 5]
Removed: 20
Custom PriorityQueue after removal: [15, 5, 10]
Next element to be removed: 15
ব্যাখ্যা:
PriorityQueue
এ Comparator.reverseOrder()
ব্যবহার করে কাস্টম সাজানো হয়েছে যাতে সবচেয়ে বড় এলিমেন্ট প্রথমে আসে।poll()
মেথড ব্যবহার করে সবচেয়ে বড় এলিমেন্ট (20
) প্রথমে বের করা হয়েছে।LinkedList
বা PriorityQueue
দিয়ে কার্যকরীভাবে পরিচালনা করা যায়।Comparator
ব্যবহার করে কাস্টম অর্ডারিং করতে পারে এবং প্রাধান্য অনুসারে ডেটা প্রক্রিয়া করতে সাহায্য করে।Java তে Queue
এবং PriorityQueue
দুটি শক্তিশালী ডেটা স্ট্রাকচার যা বিভিন্ন ধরণের ডেটা পরিচালনা এবং প্রক্রিয়া করতে ব্যবহার করা হয়।
Java তে LinkedList
একটি ডাটা স্ট্রাকচার যা Collection Framework এর অংশ। এটি একটি ডাবল লিংকড লিস্ট (doubly linked list) যা উপাদানগুলোকে লিংকেড নোড হিসেবে সংরক্ষণ করে। LinkedList ইটেমগুলোকে দ্রুত ইনসার্ট বা রিমুভ করতে সহায়তা করে, বিশেষত যখন আইটেমগুলো তালিকার শুরু বা শেষে যুক্ত বা অপসারণ করা হয়।
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
// LinkedList তৈরি
LinkedList<String> fruits = new LinkedList<>();
// List এ উপাদান যোগ করা
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
fruits.add("Mango");
// List এর আউটপুট
System.out.println("Initial List: " + fruits);
// List এ উপাদান নির্দিষ্ট স্থানে যোগ করা (প্রথম স্থানে)
fruits.addFirst("Pineapple");
System.out.println("After adding to the first: " + fruits);
// List এর শেষের দিকে একটি উপাদান যোগ করা
fruits.addLast("Grapes");
System.out.println("After adding to the last: " + fruits);
// List থেকে একটি উপাদান সরানো
fruits.remove("Banana");
System.out.println("After removing Banana: " + fruits);
// List থেকে প্রথম উপাদান সরানো
fruits.removeFirst();
System.out.println("After removing first element: " + fruits);
// List থেকে শেষ উপাদান সরানো
fruits.removeLast();
System.out.println("After removing last element: " + fruits);
// নির্দিষ্ট ইনডেক্সের উপাদান নেওয়া
String fruitAtIndex2 = fruits.get(2); // Index 2 তে যে উপাদান রয়েছে
System.out.println("Element at index 2: " + fruitAtIndex2);
// List এর আকার
int size = fruits.size();
System.out.println("Size of the List: " + size);
// List খালি কিনা তা চেক করা
boolean isEmpty = fruits.isEmpty();
System.out.println("Is the List empty? " + isEmpty);
}
}
LinkedList
তৈরি করা হয়েছে যেটি String ডেটা ধারণ করবে।fruits.add("Apple");
মেথডটি তালিকার শেষে "Apple" উপাদান যোগ করে।addFirst("Pineapple");
প্রথম স্থানে "Pineapple" যোগ করে।addLast("Grapes");
তালিকার শেষে "Grapes" যোগ করে।fruits.remove("Banana");
"Banana" উপাদানটি তালিকা থেকে সরিয়ে দেয়।fruits.removeFirst();
তালিকার প্রথম উপাদান সরিয়ে দেয়।fruits.removeLast();
তালিকার শেষ উপাদান সরিয়ে দেয়।fruits.get(2);
তালিকার 2 নম্বর ইনডেক্সে থাকা উপাদানটি রিটার্ন করে। এখানে ইনডেক্সিং 0 থেকে শুরু হয়।fruits.size();
তালিকায় মোট উপাদান সংখ্যা রিটার্ন করে।fruits.isEmpty();
চেক করে তালিকা খালি কিনা।Initial List: [Apple, Banana, Orange, Mango]
After adding to the first: [Pineapple, Apple, Banana, Orange, Mango]
After adding to the last: [Pineapple, Apple, Banana, Orange, Mango, Grapes]
After removing Banana: [Pineapple, Apple, Orange, Mango, Grapes]
After removing first element: [Apple, Orange, Mango, Grapes]
After removing last element: [Apple, Orange, Mango]
Element at index 2: Mango
Size of the List: 3
Is the List empty? false
add()
ব্যবহার করে কিছু ফ্রুট তালিকায় যোগ করা হয়েছে।addFirst()
এবং addLast()
দিয়ে তালিকার প্রথম ও শেষের স্থানে উপাদান যোগ করা হয়েছে।remove()
দিয়ে কিছু উপাদান সরানো হয়েছে এবং get()
দিয়ে নির্দিষ্ট ইনডেক্সের উপাদান নেওয়া হয়েছে।size()
এবং isEmpty()
মেথড দিয়ে তালিকার আকার এবং খালি কিনা তা চেক করা হয়েছে।এই উদাহরণটি LinkedList ব্যবহার করে ডেটার ম্যানিপুলেশন (যেমন ইনসার্ট, রিমুভ, আ্যাক্সেস) দেখাচ্ছে।
Read more